1

我怎样才能让一个JTree只听它TreeModel,而它实际上对用户可见,或者至少让它在相应JFrame的处理后立即取消注册?

据我所知,JTree从模型中注销自身的唯一情况是,如果您将其传递给新模型(使用setModel(…))。

如果模型是从其他地方引用的,这会导致树不会被垃圾收集。示例:我TreeModel使用 a实现了WatchService一个始终保持最新的文件系统树模型。即使模型上的单个侦听器也需要我不断WatchService通知模型有关文件系统更改的信息,因此它不能被垃圾收集。因此,即使JTree不再可见,它仍然由模型保存在内存中,仍然需要从 获取更新WatchService,尽管这些都不再需要了。

我想最好的方法是创建一个新的扩展类JTree来注册和注销模型。如果是这样,在显示或处置组件时会调用哪些方法?可能addNotify()并且removeNotify()是好的候选人?

4

1 回答 1

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到你的JTreewhich 监听HierarchyEvent.PARENT_CHANGED事件。每当将 JTree 添加到新窗口时,您都可以WindowListener unregisterOrWhatever在窗口关闭时添加一个。当从窗口中删除WindowListener时,不要忘记也删除。JTree

于 2013-12-04T22:47:44.323 回答