Swing Jtree

erdmulch

Bekanntes Mitglied
Hallo,

Kann mir jemand erklären, wie ich nur den letzten Pfad des Verzeichnisbaumes auslesen kann?
ich hab schon gegoogelt. jedoch ohne erfolg! 🙂

als Ausgabe sollte nur:
C:/Desktop/Java/xxx.doc

anstatt
C:/Desktop/Java
C:/Desktop/Java/xxx.doc

erscheinen

danke im voraus

erdmulch




import java.io.*;

import java.awt.*;
import java.awt.event.FocusEvent;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.filechooser.*;
import javax.swing.tree.*;

public class FileTreeTest extends JTree
{
public static void main( String[] args )
{
JFrame frame = new JFrame("JTree-Test");
frame.getContentPane().add( new JScrollPane( new FileTreeTest() ) );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );




}

private static FileSystemView SYSTEM = FileSystemView.getFileSystemView();

public FileTreeTest()
{
setModel( new FileTreeModel() );
setCellRenderer( new FileTreeCellRenderer() );
}

private class FileTreeCellRenderer extends DefaultTreeCellRenderer
{
public FileTreeCellRenderer()
{

}

public Component getTreeCellRendererComponent( JTree tree, Object value, boolean sel, boolean exp, boolean leaf, int row, boolean focus ){
super.getTreeCellRendererComponent( tree, value, sel, exp, leaf, row, focus );

File file = (File)value;

setIcon( SYSTEM.getSystemIcon( file ) );
setText( SYSTEM.getSystemDisplayName( file ));

return this;
}
}

private class FileTreeModel implements TreeModel
{
public FileTreeModel()
{

}

public Object getRoot()
{
return SYSTEM.getHomeDirectory(); // <<<<<<<<<<<<<<<<<<<<<<< Der ist wichtig
}

public int getChildCount(Object parent)
{
return SYSTEM.getFiles( (File) parent, true).length;
}

public boolean isLeaf(Object node)
{

System.out.println(node);
return ( (File) node).isFile();

}

public void addTreeModelListener(TreeModelListener l)
{

}

public void removeTreeModelListener(TreeModelListener l)
{

}

public Object getChild(Object parent, int index)
{
return SYSTEM.getFiles( (File) parent, true)[ index];
}

public int getIndexOfChild(Object parent, Object child)
{
File[] files = SYSTEM.getFiles( (File) parent, true);

for (int i = 0; i < files.length; i++)
if (files == child)
return i;

return -1;


}

public void valueForPathChanged(TreePath path, Object newValue)
{

}



}
}
 
Wenn es dir nur um die Konsolenausgabe geht 🙂

Java:
if(((File)node).isFile()) {
    System.out.println(node);
}

So gibt dein Model ja auch vor, dass ein ein Knoten ein Ordner ist und ein Blatt eine Datei.

Oder habe ich jetzt auf die schnelle was übersehen? 🙂

Viele Grüße,
David
 
Dann musst du am jTree einen entsprechenden Listener (TreeSelectionListener z.b.) registrieren um auf die Auswahl-Änderungen reagieren zu können und dort dann auslesen was grade angewählt ist.

z.b. so
Java:
        File f = (File)jTree.getSelectionPath().getLastPathComponent();
        System.out.println(f.getPath());
 
ich glaub wir schreiben aneinander vorbei
ich versuch es nochmals zu erklären
und zwar sieht man Jtree so aus:

Code:
Ordner1
    |
Ordner2
    |
Ordner3 - Unterordner3.1
                     |
              Unterordner3.2 - File3.2.1
nun will ich dass in System.out.println()
folgendes ausgegeben wird:
Ordner3/Unterordner3.2/File3.2.1

brauch ich dazu noch einen extra Listener? Wenn ja wo muss ich ihn im Programm einfügen?

danke im vorraus...
 
Zuletzt bearbeitet:
ich hoffe ich habe Verstanden was du vor hast:

Habe mir deinen Code mal in Netbeans gezogen.

Dein System.out.println ist an einer recht unglücklichen Stelle dafür untergebracht, da die isLeaf Methode immer aufgerufen wird um zu bestimmen, ob es sich in deinem Fall um einen Ordner oder um eine Datei handelt.

Wenn ich dich richtig verstehe möchtest du, wenn du ein Element im Tree auswählst den Pfad davon anzeigen lassen.
Das würde dann so passieren:

jTree1 sei dein jTree

Java:
        jTree1.addTreeSelectionListener(new TreeSelectionListener() {

            public void valueChanged(TreeSelectionEvent tse) {
                Object lastPathComponent = jTree1.getSelectionPath().getLastPathComponent();
                File f = (File)lastPathComponent;
                System.out.println(f.getPath());
            }
        });

Wenn du _nur_ Pfade zu Dateien anzeigen lassen willst einfach vorher prüfen, ob es eine Datei ist.


Java:
        jTree1.addTreeSelectionListener(new TreeSelectionListener() {

            public void valueChanged(TreeSelectionEvent tse) {
                Object lastPathComponent = jTree1.getSelectionPath().getLastPathComponent();
                File f = (File)lastPathComponent;
                if(f.isFile()){  
                System.out.println(f.getPath());
                }
            }
        });


Das System.out.println Statement in der isLead Methode würde ich einmal rauswerfen 🙂

Viele Grüße,
David
 
ich habe deine main Methode ignoriert. Die ganze Struktur ist vielleicht auch eher etwas unglücklich - zumindest wenn du das ganze irgendwann weiterverwenden willst als Element einer GUI.

Wenn du den Listener in deiner Struktur unterbringen willst, musst du das in deiner main Methode tun.

Java:
public static void main( String[] args )
{
JFrame frame = new JFrame("JTree-Test");
final FileTreeTest fileTreeTest = new FileTreeTest();
frame.getContentPane().add( new JScrollPane( fileTreeTest ) );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.pack();

fileTreeTest.addTreeSelectionListener(new TreeSelectionListener() {
 
            public void valueChanged(TreeSelectionEvent tse) {
                Object lastPathComponent = fileTreeTest.getSelectionPath().getLastPathComponent();
                File f = (File)lastPathComponent;
                if(f.isFile()){  
                System.out.println(f.getPath());
                }
            }
        });

frame.setLocationRelativeTo( null );
frame.setVisible( true );




}
 
besteht eine Frage?
ein Update mit aktuellen Code + Problemen wäre vielleicht nützlich,
und bitte JAVA-Tags verwenden
 

Zurück
Oben