【问题标题】:Updating Rendered Tree Cells更新渲染的树单元
【发布时间】:2014-04-03 15:02:10
【问题描述】:

这是我的申请。

我想要做的是,当用户的详细信息更新时,它的 JTree 中的节点也会更新。这可能吗;即使已经创建了 JTree 及其渲染的单元格?

我需要一个更新渲染单元格的示例,即使它已经创建。

这是我的查看代码:

void createTree() {

    rootNode = new DefaultMutableTreeNode("users");

    for (User user : listOfUsers) {

        String id = user.getId();
        File file = new File(id);
        DefaultMutableTreeNode node = new DefaultMutableTreeNode(file);
        rootNode.add(node);
    }

    treeModel = new DefaultTreeModel(rootNode);
    tree = new JTree(rootNode);
}

void addTreeModelListener(TreeModelListener a) {

    treeModel.addTreeModelListener(a);
}

void repaintTree() {

    treeModel.reload();
    tree.revalidate();
    tree.repaint();
}

这是我的控制器代码:

view.addTreeModelListener(new MyTreeModelListener());

class MyTreeModelListener implements TreeModelListener {
    public void treeNodesChanged(TreeModelEvent e) {

        DefaultMutableTreeNode node;
        node = (DefaultMutableTreeNode)(e.getTreePath().getLastPathComponent());

        int index = e.getChildIndices()[0];
        node = (DefaultMutableTreeNode)(node.getChildAt(index));

        System.out.println("The user has finished editing the node.");
        System.out.println("New value: " + node.getUserObject());       
    }

    public void treeNodesInserted(TreeModelEvent e) {}
    public void treeNodesRemoved(TreeModelEvent e) {}
    public void treeStructureChanged(TreeModelEvent e) {}
}

这个想法是在对对象进行更改之后,我调用 repaintTree() 方法。现在查看代码后,我认为问题在于我正在更改对象详细信息而不是节点详细信息,但这只是一种预感。

请尽快回复,非常感谢。

【问题讨论】:

    标签: java swing nodes jtree treecellrenderer


    【解决方案1】:

    Swing 使用 MVC 架构。

    所以树中包含的数据和渲染的逻辑是完全解耦和独立的。

    您可以使用 Oracle Tutorial 简单地更改树的内容而无需担心。 只是不要忘记在更新后调用revalidate()repaint() 方法。

    祝你好运。

    【讨论】:

    • 感谢您的及时回复和示例。我一直在参考他们,但目前我仍然无法使其正常工作。它的作用是当我保存时,JTree 会自动聚焦;可能是因为 JTree 正在重新验证,但由于某种原因它没有更新呈现的单元格。
    • 您是否同时调用了 revalidate 和 repaint?
    • 是的,我做了,我做了一个树模型并尝试了 reload()。
    • 对 TreeModel 进行更改后,您必须调用它的 reload 方法。
    • 我发现了问题所在;即使我正在更新对象,我也需要更新用户列表。这是否意味着当您创建对象列表时,您实际上是在复制对象以创建列表,而不是传输对象本身?
    猜你喜欢
    • 1970-01-01
    • 2017-09-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 2016-02-10
    • 2020-02-17
    • 2020-06-03
    相关资源
    最近更新 更多