使用`nodeChanged`更新树节点是否合适

时间:2013-10-17 16:26:34

标签: java swing jtree

我有JTreeJTextField。当我在树上选择节点时,文本字段将显示节点的值。然后我可以编辑文本并保存它以更改所选节点的值。我使用DefaultTreeModel的{​​{1}}方法更新树。

这是告诉树模型更新其节点的正确方法吗?对我而言,它看起来很难看,因为我明确地访问了树的模型,并告诉它发生了某些事情。

这是一些代码

nodeChanged

3 个答案:

答案 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它的一个节点的内容现在是不同的似乎是合理的。

我自己可能会遗漏一些东西,但我认为你拥有的很好。