2012-06-29 3 views
7

Ich habe ein Problem mit der Erweiterung von JTree-Knoten. Ich beginne, wenn use wählt einen Knoten alles außer dem Pfad zu dem ausgewählten Knoten und dem ausgewählten Knoten selbst zu kollabieren. Ich habe versucht,Erweiterten spezifischen JTree-Pfad

tree.collapsePath(new TreePath(tree.getModel().getRoot())); 
tree.expandPath(new TreePath(e111.getPath())); 

so etwas wie dieses verwenden, aber es scheint keine Wirkung zu haben, und ich habe wirklich keine Ahnung, wie kann ich dies tun

Hier ist, wie mein Baum aussieht:

http://img220.imageshack.us/img220/3450/jtreepng.png

Wenn ich auf 1.1.1 klicke, möchte ich alles andere als den Knoten 1.1.1 und die Elemente aus dem Pfad zu ihm kollabieren lassen.

Hier ist die Anwendung, die ich erstellt habe:

public class SelectableTree extends JFrame implements TreeSelectionListener { 
public static void main(String[] args) { 
    new SelectableTree(); 
} 

DefaultMutableTreeNode root; 
DefaultMutableTreeNode e1; 
DefaultMutableTreeNode e2; 
DefaultMutableTreeNode e3; 

DefaultMutableTreeNode e11; 
DefaultMutableTreeNode e22; 
DefaultMutableTreeNode e33; 

DefaultMutableTreeNode e111; 
DefaultMutableTreeNode e222; 
DefaultMutableTreeNode e333; 

DefaultMutableTreeNode aChild; 
private JTree tree; 
private JTextField currentSelectionField; 

public SelectableTree() { 
    super("JTree Selections"); 
    WindowUtilities.setNativeLookAndFeel(); 
    addWindowListener(new ExitListener()); 
    Container content = getContentPane(); 
    root = new DefaultMutableTreeNode("Root"); 

    e1 = new DefaultMutableTreeNode("1"); 
    e2 = new DefaultMutableTreeNode("2"); 
    e3 = new DefaultMutableTreeNode("3"); 

    e11 = new DefaultMutableTreeNode("1.1"); 
    e22 = new DefaultMutableTreeNode("2.2"); 
    e33 = new DefaultMutableTreeNode("3.3"); 

    e111 = new DefaultMutableTreeNode("1.1.1"); 
    e222 = new DefaultMutableTreeNode("2.2.2"); 
    e333 = new DefaultMutableTreeNode("3.3.3"); 

    root.add(e1); 
    root.add(e2); 
    root.add(e3); 
    e1.add(e11); 
    e2.add(e22); 
    e3.add(e33); 
    e11.add(e111); 
    e22.add(e222); 
    e33.add(e333); 

    tree = new JTree(root); 
    tree.addTreeSelectionListener(this); 
    content.add(new JScrollPane(tree), BorderLayout.CENTER); 
    currentSelectionField = new JTextField("Current Selection: NONE"); 
    content.add(currentSelectionField, BorderLayout.SOUTH); 
    setSize(250, 275); 
    setVisible(true); 
} 

public void valueChanged(TreeSelectionEvent event) { 
    tree.clearSelection(); 
    tree.collapsePath(new TreePath(tree.getModel().getRoot())); 
    tree.expandPath(new TreePath(e111.getPath())); 
} 

Edit: seltsamerweise die tree.collapsePath funktioniert gut, es scheint, dass tree.expandPath(new TreePath(e111.getPath())); das Problem ist

Antwort

6

Swing-GUI-Objekte sollten nur auf dem event dispatch thread konstruiert und manipuliert werden.

enter image description here

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTextField; 
import javax.swing.JTree; 
import javax.swing.event.TreeSelectionEvent; 
import javax.swing.event.TreeSelectionListener; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.TreePath; 

public class SelectableTree extends JFrame implements TreeSelectionListener { 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new SelectableTree(); 
      } 
     }); 
    } 
    DefaultMutableTreeNode root; 
    DefaultMutableTreeNode e1 = new DefaultMutableTreeNode("1"); 
    DefaultMutableTreeNode e2 = new DefaultMutableTreeNode("2"); 
    DefaultMutableTreeNode e3 = new DefaultMutableTreeNode("3"); 
    DefaultMutableTreeNode e11 = new DefaultMutableTreeNode("1.1"); 
    DefaultMutableTreeNode e22 = new DefaultMutableTreeNode("2.2"); 
    DefaultMutableTreeNode e33 = new DefaultMutableTreeNode("3.3"); 
    DefaultMutableTreeNode e111 = new DefaultMutableTreeNode("1.1.1"); 
    DefaultMutableTreeNode e222 = new DefaultMutableTreeNode("2.2.2"); 
    DefaultMutableTreeNode e333 = new DefaultMutableTreeNode("3.3.3"); 
    DefaultMutableTreeNode aChild; 
    private JTree tree; 
    private JTextField currentSelectionField; 

    public SelectableTree() { 
     super("JTree Selections"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     root = new DefaultMutableTreeNode("Root"); 
     root.add(e1); 
     root.add(e2); 
     root.add(e3); 
     e1.add(e11); 
     e2.add(e22); 
     e3.add(e33); 
     e11.add(e111); 
     e22.add(e222); 
     e33.add(e333); 

     tree = new JTree(root); 
     tree.addTreeSelectionListener(this); 
     add(new JScrollPane(tree), BorderLayout.CENTER); 
     currentSelectionField = new JTextField("Current Selection: NONE"); 
     add(currentSelectionField, BorderLayout.SOUTH); 
     setSize(250, 275); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    @Override 
    public void valueChanged(TreeSelectionEvent event) { 
     tree.expandPath(new TreePath(e11.getPath())); 
     currentSelectionField.setText(event.getPath().toString()); 
    } 
} 
3

Haben Sie die javadoc der expandPath Methode geprüft. Die Methode macht genau das, was sie beschreibt:

Wenn das letzte Element im Pfad ein Blatt ist, hat dies keine Auswirkung.

+0

Nun, ich habe nicht bemerkt, dass, aber auch dann, wenn ich tree.expandPath tun (neu TreePath (e11 .getPath())); Der Effekt ist, dass ich den vollständig expandierten Baum sehe. Das ist seltsam, weil genau derselbe Befehl funktioniert, wenn ich es in den Konstruktor setze. – Ivo

+0

@Robin hat recht; Ihr Beispiel benötigt auch mehr ['invokeLater()'] (http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html), gezeigt [hier] (http://stackoverflow.com/a/11260104/230513). – trashgod

3

Verwenden

tree.setSelectionPath(new TreePath(e111.getPath())); 

statt

tree.expandPath(new TreePath(e111.getPath()));