2012-06-29 23 views
7

Tengo un problema con la expansión de los nodos JTree. Empiezo cuando el uso selecciona un nodo, todo menos la ruta al nodo seleccionado y el nodo seleccionado para ser contraído. He intentado usarExpansión de la ruta JTree específica

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

algo como esto, pero parece tener ningún efecto y que realmente no tienen idea de cómo puedo hacer esto

Así es como mi árbol se ve:

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

Si hago clic en 1.1.1 quiero que todo lo demás se contraiga, pero el nodo 1.1.1 y los elementos de la ruta a él.

Aquí es la aplicación que he creado:

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())); 
} 

Editar: curiosamente los tree.collapsePath funciona bien, parece que tree.expandPath(new TreePath(e111.getPath())); es el problema

Respuesta

6

objetos GUI oscilación deben construirse y manipularse solamente en la event dispatch thread.

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

¿Ha comprobado el Javadoc del método expandPath. El método hace exactamente lo que describe:

Si el último elemento de la ruta es una hoja, esto no tendrá ningún efecto.

+0

Bueno, no se han dado cuenta de que, pero incluso entonces, si lo hago tree.expandPath (nueva TreePath (E11 .getPath())); el efecto es que veo el árbol completamente expandido. Lo que es extraño porque el mismo comando funciona cuando lo pongo en el constructor. – Ivo

+0

@Robin tiene razón; su ejemplo también necesita más ['invokeLater()'] (http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html), que se muestra [aquí] (http://stackoverflow.com/a/11260104/230513). – trashgod

3

Uso

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

en lugar de

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