如何在TreeModel不可见的情况下取消注册JTree?

时间:2013-12-04 22:28:30

标签: java swing listener jtree defaulttreemodel

如何JTree仅在用户实际可见的情况下收听其TreeModel,或者至少在相应的JFrame发出后立即取消注册设置?

据我所知,JTree从模型中取消注册的唯一情况是,如果你传递一个新模型(使用setModel(…))。

如果从其他位置引用模型,则会导致树不被垃圾回收。示例:我使用WatchService实现了TreeModel,以获得文件系统树的始终最新模型。即使模型上的单个侦听器也要求我保持WatchService通知模型有关文件系统更改的信息,因此无法对其进行垃圾回收。因此,即使JTree不再可见,它仍然由模型保存在内存中,该模型仍然需要从WatchService获取更新,尽管这些都不再是必需的。

我想最好的方法是创建一个扩展JTree的新类,用于注册和取消注册模型。如果是,那么在显示或处理组件时会调用哪些方法?可能addNotify()removeNotify()是好人选吗?

1 个答案:

答案 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