java - 更新/刷新 TreeModel

标签 java swing treemodel

我有一系列定期检索 RSS 提要的线程,并且想要使用 PropertyChangeSupport 刷新自定义 JTree。但是它使用实现 TreeModel 的自定义类,我不确定如何触发自动更改。这是可能的还是我应该使用另一个类?

最佳答案

您必须使用模型的监听器集合,并且当刷新线程注释某些更改时,您必须向它们触发事件。我认为 PropertyChangeSupport 不会对您有太大帮助,因为 Tree 模型的数据不是 Java bean 属性的形式,而且您不想触发 PropertyChangeEvents。

在我最后完成的 TreeModel 实现中,我制作了这些方法(带有德语注释:-p)

/**
 * Benachrichtigt die Listener, dass die Struktur unterhalb
 * eines bestimmten Knotens komplett geändert wurde.
 */
private void fireStructureChanged(TreePath path) {
    TreeModelEvent event = new TreeModelEvent(this, path);
    for(TreeModelListener lis : listeners) {
        lis.treeStructureChanged(event);
    }
}

/**
 * Benachrichtigt die Listener, dass unterhalb eines Knotens
 * einige Knoten entfernt wurden.
 */
private void fireNodesRemoved(TreePath parentPath,
                              int[] indices, Object[] nodes) {
    TreeModelEvent event =
        new TreeModelEvent(this, parentPath, indices, nodes);
    for(TreeModelListener lis : listeners) {
        lis.treeNodesRemoved(event);
    }
}

/**
 * Benachrichtigt die Listener, dass ein bestimmter Knoten
 * entfernt wurde.
 */
private void fireNodeRemoved(TreePath path, int index, Object node) {
    fireNodesRemoved(path, new int[]{index}, new Object[]{node});
}


/**
 * Benachrichtigt die Listener, dass sich das Aussehen einiger
 * Unterknoten eines Knotens geändert hat.
 */
private void fireNodesChanged(TreePath parentPath,
                              int[] indices, Object[] nodes) {
    TreeModelEvent event =
        new TreeModelEvent(this, parentPath, indices, nodes);
    for(TreeModelListener lis : listeners) {
        lis.treeNodesChanged(event);
    }
}

/**
 * Benachrichtigt die Listener, dass sich das Aussehen eines Knotens
 * geändert hat.
 *
 * @param parentPath der Pfad des Elternknotens des relevanten Knotens.
 * @param index der Index des Knotens unterhalb des Elternknotens.
 *           Falls < 0, werden die Listener nicht benachrichtigt.
 * @param node der Subknoten.
 */
private void fireNodeChanged(TreePath parentPath,
                             int index, Object node) {
    if(index >= 0) {
        fireNodesChanged(parentPath, new int[]{index}, new Object[]{node});
    }
}

/**
 * Benachrichtigt die Listener, dass unterhalb eines Knotens einige
 * Knoten eingefügt wurden.
 */
private void fireNodesInserted(TreePath parentPath,
                               int[] indices, Object[] subNodes) {
    TreeModelEvent event =
        new TreeModelEvent(this, parentPath, indices, subNodes);
    for(TreeModelListener lis : listeners) {
        lis.treeNodesInserted(event);
    }
}

/**
 * Benachrichtigt die Listener, dass ein Knoten eingefügt wurde.
 */
private void fireNodeInserted(TreePath parentPath,
                              int index, Object node) {
    fireNodesInserted(parentPath, new int[]{index}, new Object[]{node});
}

然后,只要发生变化,就会从模型的其他部分调用正确的方法。

如果你想让它变得简单,你可以简单地总是用根节点触发一个treeStructureChanged事件,这将导致整个树重新加载。对于更精细的事件,您需要查看实际上发生了什么变化,然后触发它。

关于java - 更新/刷新 TreeModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5412957/

相关文章:

java - KeyBindings 和 KeyListeners 之间的区别

javascript - 使用 tree-model-js 异步遍历树

java - 如何使用存储库接口(interface)在 Spring Data 中通过其嵌套对象的 objectId 查找集合?

java - 隐藏面板时丢失 JDialog 标题 (Java)

c# - 如何在 Java swings GUI 应用程序中访问和使用 C# dll

java - Swing中关于 "virtual trees"(自定义TreeModel)的问题

c++ - GTKMM set_value_vfunc 函数是一个谎言吗?

java - 如何在java中创建索引文件?

java - 为什么我在 Ruby 中使用递归时无法得到正确答案?

java - 从 java servlet 下载时文件损坏