假设您有一个 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/