我有JTree
和JTextField
。当我在树上选择节点时,文本字段将显示节点的值。然后我可以编辑文本并保存它以更改所选节点的值。我使用DefaultTreeModel
的{{1}}方法更新树。
这是告诉树模型更新其节点的正确方法吗?对我而言,它看起来很难看,因为我明确地访问了树的模型,并告诉它发生了某些事情。
这是一些代码
nodeChanged
答案 0 :(得分:5)
只是为了完整性:如果你通过模型api独家更新节点,它可能看起来稍微不那么丑陋
TreePath selected = tree.getSelectionPath();
tree.getModel().valueForPathChanged(selected, textBox.getText());
答案 1 :(得分:2)
您的示例似乎正确无误。扩展@ matt的正确answer,此MVC illustration可能会提供一些见解。因为JTree
视图也允许编辑,所以它可以调用模型的方法。该模型反过来通过代表您调用fireTreeNodesChanged()
来通知所有侦听器,包括树本身。要查看效果,请添加另一个侦听器:
tree.getModel().addTreeModelListener(new TreeModelListener() {
@Override
public void treeNodesChanged(TreeModelEvent e) {
update(e);
}
@Override
public void treeNodesInserted(TreeModelEvent e) {
update(e);
}
@Override
public void treeNodesRemoved(TreeModelEvent e) {
update(e);
}
@Override
public void treeStructureChanged(TreeModelEvent e) {
update(e);
}
private void update(TreeModelEvent e) {
System.out.println(e);
}
});
附加说明:
应在event dispatch thread上仅构建和操作Swing GUI对象。
不使用setSize()
,而是覆盖树状面板的getPreferredSize()
方法和pack()
封闭框架。
JPanel treePanel = new JPanel(){
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 200);
}
};
…
this.pack();
答案 2 :(得分:1)
从JavaDoc和DefaultTreeModel和DefaultMutableTreeNode的代码开始,我认为你正在做的是好的。如果您更改了模型的结构(例如通过删除节点),那么您不需要在模型上调用任何内容,因为TreeModel会知道您对它做了一些事情。但是,在这种情况下,您将更改模型引用的节点的内容。所以你必须通知TreeModel它的一个节点的内容现在是不同的似乎是合理的。
我自己可能会遗漏一些东西,但我认为你拥有的很好。