java - 如何在 Java 中启动 TreeModel 的更改事件?

标签 java swing jtree treemodel

假设您有一个 JTree,其模型实现了 TreeModel,并且所有节点都实现了 TreeNode。 假设模型后台发生了一些事情(不是通过 GUI),例如 CRUD 事件,更新了模型并且应该更新 JTree。 由于模型受到其他 View 的 CRUD 影响,因此使用 DefaultTreeModel 来完成此任务似乎不是一个好主意,如果我错了,请纠正我。

我想您需要以某种方式向 TreeModel 发出更改信号,例如以某种方式触发某些事件?

顺便说一句,我还没有成功实现这些方法:

public void addTreeModelListener( TreeModelListener l )
public void removeTreeModelListener( TreeModelListener l )

我想需要为这样的功能实现这些方法。

最佳答案

我喜欢使用这种通用的ListenerList:

public class ListenerList {
    private final List<Object> list = new ArrayList<Object>();

    public ListenerList() {
    }

    public void addListener(Object listener) {
        list.add(listener);
    }

    public void removeListener(Object listener) {
        list.remove(listener);
    }

    public <T> T getNotifier(Class<T> intf) {
        ClassLoader cl = intf.getClassLoader();
        return intf.cast(Proxy.newProxyInstance(cl, new Class[] {intf},
                (Object proxy, Method method, Object[] args)
                        -> actualInvoke(method, args)));
    }

    private Object actualInvoke(Method method, Object args[]) {
        Object result = null;
        for (Object listener: list) {
            try {
                result = method.invoke(listener, args);
            } catch (IllegalAccessException e) {
                LOG.error("Error invoking listener method", e);
            } catch (InvocationTargetException e) {
                LOG.error("Error invoking listener method", e);
            }
        }
        return result;
    }
}

我在模型类中使用:

public class MyTreeModel implements TreeModel {
    private final ListenerList listeners = new ListenerList();
    private final TreeModelListener notifier = listeners.getNotifier(TreeModelListener.class);

    public void addTreeModelListener( TreeModelListener l ) {
        listeners.addListener(l);
    }

    public void removeTreeModelListener( TreeModelListener l ) {
        listeners.removeListener(l);
    }

    protected void fireTreeNodesChanged(TreeModelEvent e) {
        notifier.treeNodesChanged(e);
    }

    protected void fireTreeNodesInserted(TreeModelEvent e) {
        notifier.treeNodesInserted(e);
    }

    protected void fireTreeNodesRemoved(TreeModelEvent e) {
        notifier.treeNodesRemoved(e);
    }

    protected void fireTreeStructureChanged(TreeModelEvent e)
        notifier.treeStructureChanged(e);
    }

    ...
}

关于java - 如何在 Java 中启动 TreeModel 的更改事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58988195/

相关文章:

java - 如何在线实现接口(interface)而不是在 Dart/Flutter 中使用类?

java - 如何将参数传递给接口(interface)的一个实现者而不是其他实现者(不在构造函数中传递它)?

Java JTree 获取所选节点的名称

java - Jframe 与 XML GUI

java - 将文本字段数据添加到列表中。 Swing

java Swing : add custom graphical button to JTree item

java - 我无法使用 JTree 监听器更改 cardLayout 中的卡

java - 从嵌套在 Map 中的 List 中删除值

java - JTable 的 Customrenderer 被多次调用

java - Java 中的两个 JTree 相等/赋值