首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新/刷新TreeModel

更新/刷新TreeModel
EN

Stack Overflow用户
提问于 2011-03-24 07:29:36
回答 2查看 5.1K关注 0票数 2

我有一系列的线程检索RSS在固定的时间间隔,并希望刷新自定义JTree使用PropertyChangeSupport。但是,它使用了一个实现TreeModel的自定义类,我不确定如何触发自动更改。这是可能的,还是我应该使用另一个类?

EN

回答 2

Stack Overflow用户

发布于 2011-03-24 07:48:33

您必须使用模型的侦听器集合,并且当刷新线程注释某些更改时,您必须向它们激发事件。我认为PropertyChangeSupport在这方面对您帮助不大,因为树模型的数据不是Java beans属性的形式,并且您不想触发PropertyChangeEvents。

在我最后做的一个TreeModel实现中,我创建了这些方法(带有德语注释:-p)

代码语言:javascript
复制
/**
 * 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事件,这会导致整个树重新加载。对于更好的事件,您需要查看实际发生了什么变化,并触发此命令。

票数 3
EN

Stack Overflow用户

发布于 2012-02-16 20:07:59

不完全确定您所说的“使用PropertyChangeListener刷新树”是什么意思,但同意Paul的观点:PropertyChangeListener在通知treeModel侦听器(包括JTree)方面没有帮助。

通过适当的TreeModelEvents通知其侦听器是任何TreeModel实现的固有责任。如果它监听所包含节点的更改(这可能会触发f.i.PropertyChangeEvents),那么它必须将这些转换为TreeModelEvents。

伪代码片段:

代码语言:javascript
复制
public class MyTreeModel implements TreeModel {

     PropertyChangeListener nodeListener;

     // custom method to insert a node
     public void addNodeTo(MyBean child, MyBean parent) {
         // ... internal logic to add the new node

         fireChildAdded(getPathToRoot(parent), child)
         // add a PropertyChangeListener to new node so the model
         // can comply to its notification contract
         child.addPropertyChangeListener(getPropertyChangeListener();
     }

     protected void nodePropertyChanged(MyBean bean) {
          firePathChanged(getPathToRoot(bean));
     }

     protected TreePath getPathToRoot(MyBean bean) {
          // construct and return a treePath to the root
     }

     protected PropertyChangeListener getPropertyChangeListener() {
          if (nodeListener == null) {
             nodeListener = new PropertyChangeChangeListener() {
                 public void propertyChanged(...) {
                     nodeChanged((MyBean) e.getSource();
                 }

             );
     }

}

构造实际的事件有点令人困惑(而且文档也很少),这就是为什么使用SwingX has a helper class TreeModelSupport来简化这项任务。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5412957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档