如何JTree
仅在用户实际可见的情况下收听其TreeModel
,或者至少在相应的JFrame
发出后立即取消注册设置?
据我所知,JTree
从模型中取消注册的唯一情况是,如果你传递一个新模型(使用setModel(…)
)。
如果从其他位置引用模型,则会导致树不被垃圾回收。示例:我使用WatchService
实现了TreeModel
,以获得文件系统树的始终最新模型。即使模型上的单个侦听器也要求我保持WatchService
通知模型有关文件系统更改的信息,因此无法对其进行垃圾回收。因此,即使JTree
不再可见,它仍然由模型保存在内存中,该模型仍然需要从WatchService
获取更新,尽管这些都不再是必需的。
我想最好的方法是创建一个扩展JTree
的新类,用于注册和取消注册模型。如果是,那么在显示或处理组件时会调用哪些方法?可能addNotify()
和removeNotify()
是好人选吗?
答案 0 :(得分:0)
使用JTree的文档:http://docs.oracle.com/javase/7/docs/api/javax/swing/JTree.html。
JTree
有一个名为treeModelListener
的受保护字段,您可以使用JTreeModelListener.removeTreeModelListener()
直接从模型中删除该字段。如果要随意从其自己的侦听器中删除树模型,请扩展JTree
并添加以下方法:
public void unregisterOrWhatever() {
this.treeModel.removeTreeModelListener(this.treeModelListener);
}
如果您希望通过聆听关闭窗口的事件,请向HierarchyListener
添加JTree
,以便收听HierarchyEvent.PARENT_CHANGED
个事件。每当将JTree添加到新窗口时,您都可以在窗口关闭时添加WindowListener
unregisterOrWhatever
。从窗口中移除WindowListener
时,请不要忘记删除JTree
。