繁体   English   中英

在不可见的JTree上如何注销JTree?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM