[英]Expanding specific JTree path
我在擴展JTree節點時遇到問題。 我開始使用時選擇一個節點,但是所選節點的路徑和所選節點本身都要折疊。 我試過用了
tree.collapsePath(new TreePath(tree.getModel().getRoot()));
tree.expandPath(new TreePath(e111.getPath()));
像這樣的東西,但它似乎沒有任何影響,我真的不知道我怎么能這樣做
這是我的樹的樣子:
http://img220.imageshack.us/img220/3450/jtreepng.png
如果我單擊1.1.1我希望其他所有內容都被折疊,但1.1.1節點和路徑中的元素將被折疊。
這是我創建的應用程序:
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()));
}
編輯:奇怪的是, tree.collapsePath
工作得很好,似乎是tree.expandPath(new TreePath(e111.getPath()));
是問題
應該僅在事件派發線程上構造和操作Swing GUI對象。
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());
}
}
您是否檢查了expandPath
方法的javadoc。 該方法完全符合它的描述:
如果路徑中的最后一項是葉子,則無效。
使用
tree.setSelectionPath(new TreePath(e111.getPath()));
代替
tree.expandPath(new TreePath(e111.getPath()));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.