![](/img/trans.png)
[英]Why does JTree handle events from DefaultTreeModel but not TreeModel?
[英]How to unregister JTree from TreeModel while it is not visible?
我如何才能让JTree
仅在其实际上对用户可见时侦听其TreeModel
,或者至少在处置了相应的JFrame
立即让其注销自身?
据我所知, JTree
唯一从其模型中注销自身的情况是是否将其传递给新模型(使用setModel(…)
)。
如果从其他地方引用了模型,这将导致树无法被垃圾回收。 示例:我使用WatchService
实现了TreeModel
,以WatchService
具有文件系统树的始终最新的模型。 即使是模型上的单个侦听器,我也需要保持WatchService
通知模型有关文件系统的更改,因此无法对其进行垃圾收集。 因此,即使JTree
不再可见,该模型仍将其保留在内存中,该模型仍需要从WatchService
获得更新,尽管不再需WatchService
。
我想最好的方法是创建一个扩展JTree
的新类,该类对模型进行注册和注销。 如果是这样,那么在显示或处置组件时将调用哪些方法? 可能addNotify()
和removeNotify()
是很好的候选人吗?
使用JTree的文档: http : //docs.oracle.com/javase/7/docs/api/javax/swing/JTree.html 。
JTree
具有一个称为treeModelListener
的受保护字段,您可以使用JTreeModelListener.removeTreeModelListener()
直接从模型中删除它。 如果要JTree
从其自己的侦听器中删除树模型,请扩展JTree
并添加以下方法:
public void unregisterOrWhatever() {
this.treeModel.removeTreeModelListener(this.treeModelListener);
}
如果您想通过监听窗口关闭事件来JTree
,请向您的JTree
添加一个HierarchyListener
以监听HierarchyEvent.PARENT_CHANGED
事件。 只要将JTree添加到新窗口中,就可以在关闭窗口时添加WindowListener
unregisterOrWhatever
。 从窗口删除JTree
时,请不要忘记也删除WindowListener
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.