[Erledigt] JTree mit JFileChooser verknüpfen

Ist es möglich JTree mit JFileChooser zu verknüpfen, so dass wenn der User ein Ordner mit Unterordnern auswählt, es automatisch auf den JTree mit allen Unterordnern und Datein übertragen wird? Also der JTree soll automatisch die Baumstruktur von dem Ordner übernehmen und alle Unterordner und Dateien darstellen. Hat jemand zufällig ein Tutorial dazu?

Danke

naja du musst eigentlich nur die geladene Datei nehmen und in deinen Tree packen, anschließend musst du alle Unterordner durchsuchen und die auch hinzufügen. Das ist eigentlich nicht so schwer.
Wenn du jedoch auch willst das sich die Ordner/Dateien aktualisieren wenn sich was ändert musst du bei jedem Öffnen eines Knoten den Ordner neu durchsuchen. Vielleicht hilft dir Benis Tut http://www.java-forum.org/de/viewtopic.php?p=150563

wegen dem Hinzufügen sieh dir das DefaultTreeModel und DefaultMutableTreeNode an

Hhmm ist vieleicht der JFileChooser nicht das Richtige? Ich kann damit eine Datei öffnen/auswählen, ich möchte aber einen Ordner auswählen und keine Datei. Die Dateien befinden sich im Ordner.

das kannst du auch alles mit dem JFileChooser machen siehe http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JFileChooser.html#setFileSelectionMode(int)

Danke werde mir dann erstmal genauer den JFileChooser anschauen.

So Frage :slight_smile:

package de.bytewelt.bu_tool.tests.jfilechooser;

import java.awt.BorderLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;


public class FileChooserDemo extends JPanel implements ActionListener {

	static private final String newline = "
";
	JButton openButton, saveButton;
	JTextArea log;
	JFileChooser fc;
	
	public FileChooserDemo() {
        super(new BorderLayout());
        
        log = new JTextArea(5,20);
        log.setMargin(new Insets(5,5,5,5));
        log.setEditable(false);
        JScrollPane logScrollPane = new JScrollPane(log);
        fc = new JFileChooser();
        
        fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
        
        openButton = new JButton("Open a File...", createImageIcon("images/Open16.gif"));
        openButton.addActionListener(this);
        saveButton = new JButton("Save a File...", createImageIcon("images/Save16.gif"));
        saveButton.addActionListener(this);

        JPanel buttonPanel = new JPanel(); //use FlowLayout
        buttonPanel.add(openButton);
        buttonPanel.add(saveButton);
        
        add(buttonPanel, BorderLayout.PAGE_START);
        add(logScrollPane, BorderLayout.CENTER);
    }
	
    public void actionPerformed(ActionEvent e) {

        //Handle open button action.
        if (e.getSource() == openButton) {
            int returnVal = fc.showOpenDialog(FileChooserDemo.this);

            if (returnVal == JFileChooser.APPROVE_OPTION) {
                File file = fc.getSelectedFile();
                treeWalk(file);
                //This is where a real application would open the file.
                log.append("Opening: " + file.getName() + "." + newline);
            } else {
                log.append("Open command cancelled by user." + newline);
            }
            log.setCaretPosition(log.getDocument().getLength());
            

        //Handle save button action.
        } else if (e.getSource() == saveButton) {
            int returnVal = fc.showSaveDialog(FileChooserDemo.this);
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                File file = fc.getSelectedFile();
                //This is where a real application would save the file.
                log.append("Saving: " + file.getName() + "." + newline);
            } else {
                log.append("Save command cancelled by user." + newline);
            }
            log.setCaretPosition(log.getDocument().getLength());
        }
    }
    
	static void treeWalk(File file2) {
 		if (file2.isDirectory()) {
 			File[] children = file2.listFiles();
 			for (int i = 0; i < children.length; i++) {
 				treeWalk(children**);
 			}
 		} else {
 			System.out.println(file2.getAbsolutePath());
 		}
 	}
    
    protected static ImageIcon createImageIcon(String path) {
        java.net.URL imgURL = FileChooserDemo.class.getResource(path);
        if (imgURL != null) {
            return new ImageIcon(imgURL);
        } else {
            System.err.println("Couldn't find file: " + path);
            return null;
        }
    }
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("FileChooserDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create and set up the content pane.
        FileChooserDemo fcm = new FileChooserDemo();
        fcm.setOpaque(true);
        frame.add(fcm);
        

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }
    
    
    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
            	createAndShowGUI();
            }
        });
    }
}

Den FileChooser Beispiel habe ich von Sun Seite, die Methode treeWalk auf einer anderen Seite gefunden :slight_smile: Und dann die Sachen zusammengeklebt lol. Scheint alles zu gehen, nur verstehe ich etwas nicht ganz.

File file = fc.getSelectedFile();
Damit übergebe ich den Pfad meiner ausgewählten Datei/Ordner an das Objekt file von Typ File. Ich hätte an dieser Stelle erstmal neue Instanz erstellt und dann den Pfad übergeben, weil ich so immer gemacht habe. Also so: File file = new File(fc.getSelectedFile); das geht aber nicht :D, weil das nicht als Parameter passt. Also wird keine neue Instanz der Klasse File erstellt und der Wert/Pfad wird ohne Neuinstantierierung gespeichert? Dh. der Pfad befindet sich im Obejkt file und in der Klasse File auch? Ich frage das, weil man hier:
static void treeWalk(File file2) {
neues Objekt vom Typ File estellt. file2 Objekt hat aber den Wert vom file objekt, obwohl ich nirgendwo gesagt habe file = file2.
Ich dachte immer, dass der Wert nur im Objekt und nicht der Klasse sitzt.
Kann mich jemand aufklären ? :smiley:

Danke

ich hab dir doch gesagt mach es selbst :wink:

Wenn du in die API gesehen hättest, hättest du gesehen das dir getSelectedFile() ein File Objekt zurückgibt, daher musst du kein neues erstellen.

Und nein in der Klasse File kann sich kein Pfad befinden, weil eine Klasse nur eine Bauanleitung ist wie ein Objekt auszusehen hat

static void treeWalk(File file2) {
neues Objekt vom Typ File estellt. file2 Objekt hat aber den Wert vom file objekt, obwohl ich nirgendwo gesagt habe file = file2.
Ich dachte immer, dass der Wert nur im Objekt und nicht der Klasse sitzt.
Kann mich jemand aufklären ? :smiley:

Danke

Wie kommst du auf die Klasse?
du wirst doch irgendwo sagen treeWalk(file) damit sagst du indirekt file2=file

[QUOTE=EagleEye]Wenn du in die API gesehen hättest, hättest du gesehen das dir getSelectedFile() ein File Objekt zurückgibt, daher musst du kein neues erstellen.
[/QUOTE]

Hab in API nachgeguckt und auch gesehen dass die Methode ein FileObjekt zurückgibt, nur hat das mir nix gesagt. Bedeutet es, wenn eine Methode keinen Datentyp wie int, String, char etc zurückgibt, sondern eine abgeleitete Klasse von Object, dass ich keine neue Instanz erzeugen muss?

ich hab dir doch gesagt mach es selbst

Hab wirklich versucht, bin aber auf solche Idee nicht gekommen, und wenn doch, hätte ich wahrscheinlich so was nicht schreiben können, bin halt siehe meine Signatur

du wirst doch irgendwo sagen treeWalk(file) damit sagst du indirekt file2=file

Stimmt, verstanden.

nein das stimmt so nicht ganz
auch bei einem int musste keinen neuen erzeugen, man könnte das getSelectedFile so sehen File file = new File(PfadausChooser);
was eine Methode zurückgibt wird einfach in die Variable gepackt die du davor schreibst

Hmm :verzweifel:
Aber wie merke ich, wann ich neue Instanz brauche und wann nicht. Wenn ich mich nicht irre, muss ich oft neue Instanz erzeugen, wenn ich in ein Objekt etwas speichen will, aber vieleicht irre ich mich.

na du musst eine neue Erzeugen wenn du eine neue brauchst :wink:
so einfach ist das :smiley: