TreePath selbst erstellen und expandPath

Ingerten

Bekanntes Mitglied
Hallo Männers,

ich habe da ein Problem, wo ich einfach nicht weiter komme und ich es schon mit verschiedenen Methoden versucht habe.

Ich möchte eigentlich nur, einen TreePath selbst er stellen und ihn dann mit expandPath öffnen.
Es klappt aber nicht.

Ich hoffe sowas ist überhaubt möglich.

Hier ein Beispiel:

Java:
import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import javax.swing.JButton;

import java.awt.BorderLayout;

import javax.swing.JTextField;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class FileBrowser implements Runnable {

    private DefaultMutableTreeNode root;

    private DefaultTreeModel treeModel;

    private JTree tree;

    /**
     * @wbp.parser.entryPoint
     */
    @Override
    public void run() {
        JFrame frame = new JFrame("File Browser");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final File fileRoot = new File("C:/workspace/testJTree/daten");
        root = new DefaultMutableTreeNode(new FileNode(fileRoot));
        treeModel = new DefaultTreeModel(root);
     
        JButton btnNewButton = new JButton("suche");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                List list = new ArrayList();
                list.add(fileRoot);
                list.add("a");
                list.add("1");
                System.out.println(new TreePath(list.toArray()));
                tree.expandPath(new TreePath(list.toArray()));
            }
        });
        frame.getContentPane().add(btnNewButton, BorderLayout.NORTH);

        tree = new JTree(treeModel);
        tree.setShowsRootHandles(true);
        JScrollPane scrollPane = new JScrollPane(tree);

        frame.getContentPane().add(scrollPane);
        frame.setLocationByPlatform(true);
        frame.setSize(640, 480);
        frame.setVisible(true);

        CreateChildNodes ccn =
                new CreateChildNodes(fileRoot, root);
        new Thread(ccn).start();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new FileBrowser());
    }

    public class CreateChildNodes implements Runnable {

        private DefaultMutableTreeNode root;

        private File fileRoot;

        public CreateChildNodes(File fileRoot,
                DefaultMutableTreeNode root) {
            this.fileRoot = fileRoot;
            this.root = root;
        }

        @Override
        public void run() {
            createChildren(fileRoot, root);
        }

        private void createChildren(File fileRoot,
                DefaultMutableTreeNode node) {
            File[] files = fileRoot.listFiles();
            if (files == null) return;

            for (File file : files) {
                DefaultMutableTreeNode childNode =
                        new DefaultMutableTreeNode(new FileNode(file));
                node.add(childNode);
                if (file.isDirectory()) {
                    createChildren(file, childNode);
                }
            }
        }

    }

    public class FileNode {

        private File file;

        public FileNode(File file) {
            this.file = file;
        }

        @Override
        public String toString() {
            String name = file.getName();
            if (name.equals("")) {
                return file.getAbsolutePath();
            } else {
                return name;
            }
        }
    }

}
 

Anhänge

  • daten.PNG
    daten.PNG
    13,2 KB · Aufrufe: 73
Klar ist das möglich. Im Pfad reichen allerdings keine Strings aus. Du musst dort die Referenzen der TreeNodes angeben. Z.B. so etwa:
tree.expandPath( new TreePath( new Object[] { root } ) );
 
Also,

ich habe es jetzt mal so versucht:

Java:
                DefaultMutableTreeNode nodeRoot = new DefaultMutableTreeNode(fileRoot);
                DefaultMutableTreeNode nodeA = new DefaultMutableTreeNode("a");
              
                TreeNode pathRoot = nodeRoot.getRoot();
                TreeNode path = nodeA.getRoot();         
              

                TreePath neu = new TreePath(new Object[]{pathRoot, path});
                tree.expandPath(neu);

Aber es passiert nichts.
 
1. getRoot() gibt den Rootknoten des Baumes zurück in dem sich die TreeNodes befinden. Das bringt dir nichts.

2. Du brauchst wie gesagt die Referenzen der TreeNodes. Um das mal an einem kleinen Beispiel zu verdeutlichen:
Java:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;

public class PathExample {

   public static void main( String[] args ) {

     final DefaultMutableTreeNode root = new DefaultMutableTreeNode( "root" );
     final DefaultMutableTreeNode nodeA = new DefaultMutableTreeNode( "A" );
     final DefaultMutableTreeNode nodeB = new DefaultMutableTreeNode( "B" );
     final DefaultMutableTreeNode node1 = new DefaultMutableTreeNode( "1" );
     final DefaultMutableTreeNode node2 = new DefaultMutableTreeNode( "2" );

     root.add( nodeA );
     root.add( nodeB );
     nodeA.add( node1 );
     nodeB.add( node2 );

     final DefaultTreeModel treeModel = new DefaultTreeModel( root );
     final JTree tree = new JTree( treeModel );
     tree.collapseRow( 0 );

     final JButton northButton = new JButton( "expand (korrekt)" );
     northButton.addActionListener( new ActionListener() {

       @Override
       public void actionPerformed( ActionEvent arg0 ) {
         // So ist es richtig
         tree.expandPath( new TreePath( new Object[] { root, nodeA } ) );
       }
     } );

     final JButton southButton = new JButton( "expand (fehlerhaft)" );
     southButton.addActionListener( new ActionListener() {

       @Override
       public void actionPerformed( ActionEvent arg0 ) {
         // Wird nicht gehen, da im TreePath die Referenzen benötigt werden
         final DefaultMutableTreeNode cloneRoot = new DefaultMutableTreeNode( "root" );
         final DefaultMutableTreeNode cloneA = new DefaultMutableTreeNode( "A" );
         tree.expandPath( new TreePath( new Object[] { cloneRoot, cloneA } ) );
       }
     } );

     final JFrame frame = new JFrame();
     frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
     frame.add( tree, BorderLayout.CENTER );
     frame.add( northButton, BorderLayout.NORTH );
     frame.add( southButton, BorderLayout.SOUTH );
     frame.setSize( 400, 300 );
     frame.setVisible( true );
   }
}
Du brauchst eine Methode, die dir die Abfrage nach Nachfolgern erleichert. Die könnte z.B. so aussehen:
Java:
  public static DefaultMutableTreeNode getChildByName( TreeNode node, String name ) {
     for ( int i = 0; i < node.getChildCount(); i++ ) {
       final TreeNode child = node.getChildAt( i );
       if ( child instanceof DefaultMutableTreeNode ) {
         DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) child;
         if ( childNode.getUserObject().toString().equals( name ) ) {
           return childNode;
         }
       }
     }
     return null;
   }
In deinem Code ganz oben kannst du dann einen Pfad so erstellen:
Java:
final DefaultMutableTreeNode nodeA = getChildByName( root, "a" );
final DefaultMutableTreeNode node1 = getChildByName( nodeA, "1" );
tree.expandPath( new TreePath( new Object[] { root, nodeA, node1 } ) );
 
Mal von der Diskussion mit Referenz oder nicht Referenz abgesehen ist mir nich ganz klar was der TE erreichen will. In seinem ursprünglichen Beispielcode hat er doch versucht in dem Action Listener zwei zusaetzliche Elemente in seinen Baum einzufügen (auch wenn er es falsch implementiert hat). Diese neuen Elemente kannst du doch nicht mit expandPath in deinen Baum einfügen !! Was hattest du denn erwartet was passiert ? expandPath stellt doch nur sicher dass der durch diesen Pfad spezifizierte Knoten aufgeklappt und sichtbar ist. Wenn es den Knoten im Baum nicht gibt passiert halt nichts.
 

Zurück
Oben