2012-06-29 22 views
7

Tôi gặp sự cố khi mở rộng các nút JTree. Tôi bắt đầu khi sử dụng chọn một nút tất cả mọi thứ nhưng đường dẫn đến nút đã chọn và chính nút đã chọn sẽ bị thu gọn. Tôi đã cố gắng sử dụngMở rộng đường dẫn JTree cụ thể

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

một cái gì đó như thế này nhưng nó dường như không có hiệu lực và tôi thực sự không có ý tưởng làm thế nào tôi có thể làm điều này

Sau đây là cách cây của tôi trông:

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

Nếu tôi nhấp 1.1.1, tôi muốn mọi thứ khác bị thu gọn nhưng nút 1.1.1 và các phần tử từ đường dẫn đến nó.

Dưới đây là các ứng dụng tôi đã tạo:

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: lạ đủ các tree.collapsePath công trình tốt, có vẻ như tree.expandPath(new TreePath(e111.getPath())); là vấn đề

Trả lời

6

Đối tượng GUI Swing phải được xây dựng và thao tác chỉ trên 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

Bạn đã kiểm tra javadoc của phương pháp expandPath. Phương pháp thực hiện chính xác những gì mô tả:

Nếu mục cuối cùng trong đường dẫn là lá, điều này sẽ không có hiệu lực.

+0

Vâng, tôi đã không nhận thấy rằng, nhưng thậm chí sau đó nếu tôi làm tree.expandPath (TreePath mới (E11 .getPath())); hiệu quả là tôi thấy cây được mở rộng hoàn toàn. Điều này thật lạ vì lệnh chính xác giống như khi tôi đặt nó trong hàm tạo. – Ivo

+0

@Robin là đúng; ví dụ của bạn cũng cần thêm ['invokeLater()'] (http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html), được hiển thị [ở đây] (http://stackoverflow.com/a/11260104/230513). – trashgod

3

Sử dụng

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

thay vì

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