#jtree
#java #swing #jtree
Вопрос:
У меня есть статическое jtree в области прокрутки. И теперь я пытаюсь добавить дочерний элемент в jtree, он был добавлен успешно. Теперь добавленный узел не виден в jtree.
Попытка 1: я пробовал с model.reload()
DefaultTreeModel model = (DefaultTreeModel) (tree.getModel());
TreePath Path = findByName(tree, new String[]{Globals.CONS_UIAPROJECTS});
DefaultMutableTreeNode pnode = (DefaultMutableTreeNode) Path.getLastPathComponent();
model.insertNodeInto(UIAProjectExploreDisplay.nodeProTree, pnode, pnode.getChildCount());
model.reload();
Попытка 2: я тоже пробовал с tree.setModel()…
DefaultTreeModel model = (DefaultTreeModel) (tree.getModel());
TreePath Path = findByName(tree, new String[]{Globals.CONS_UIAPROJECTS});
DefaultMutableTreeNode pnode = (DefaultMutableTreeNode) Path.getLastPathComponent();
model.insertNodeInto(UIAProjectExploreDisplay.nodeProTree, pnode, pnode.getChildCount());
DefaultTreeModel projectTreeModel = new DefaultTreeModel((DefaultMutabletreeNode) model.getRoot());
tree.setModel(projectTreeModel);
Даже тогда недавно добавленный дочерний элемент не виден. но он добавляется в дерево. Я тестировал, печатая дочерний элемент.
Предложите мне решение.
Ответ №1:
Просто попробуйте следующую строку:
model.reload();
Проверьте этот простой пример. У меня это работает и показывает оба новых узла после 5-секундной задержки.
/**
* @param args
*/
public static void main(String[] args) {
TestTree frame= new TestTree();
frame.setSize(400, 400);
frame.setVisible(true);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
MutableTreeNode root = (MutableTreeNode)tree.getModel().getRoot();
System.out.println("A: " root.getChildCount());
try {
Thread.sleep(5000);
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
root.insert(new DefaultMutableTreeNode("test"), 1);
((DefaultMutableTreeNode)root.getChildAt(2)).insert(new DefaultMutableTreeNode("test2"), 1);
((DefaultTreeModel)(tree.getModel())).reload();
System.out.println("B: " root.getChildCount());
System.out.println(root.getChildAt(1));
}
Комментарии:
1. тогда, может быть, вам следует закончить этот вопрос и отметить ответ? Кстати, что пошло не так раньше?
2. model.reload() приводит к свертыванию дерева. Существуют ли какие-либо альтернативы расширению левого узла?
Ответ №2:
Я думаю, возможно, вы забыли установить родительский элемент вашего нового узла в методе вставки вашего TreeNode … вот мой код
public void insert(MyTreeNode newChild, int childIndex) {
if (!allowsChildren) {
throw new IllegalStateException("node does not allow children");
} else if (newChild == null) {
throw new IllegalArgumentException("new child is null");
}
newChild.setParent(this);
if (children == null) {
children = new ArrayList<GoodSort>();
}
children.add(childIndex,(GoodSort)newChild);
((GoodSort)newChild).parent = this;
}