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
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
@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