Java 当JTree不可见时,如何从TreeModel中注销它?

Java 当JTree不可见时,如何从TreeModel中注销它?,java,swing,listener,jtree,defaulttreemodel,Java,Swing,Listener,Jtree,Defaulttreemodel,我如何才能让a在用户实际可见的情况下只监听它,或者至少在处理相应的文件后让它自己注销 据我所知,JTree从其模型中注销自己的唯一情况是,如果您使用setModel向它传递一个新模型 如果模型是从其他地方引用的,这将导致树不会被垃圾收集。示例:我使用实现了一个TreeModel,以获得文件系统树的始终最新模型。即使模型上只有一个侦听器,我也需要让WatchService通知模型文件系统的更改,因此它不能被垃圾收集。因此,即使JTree不再可见,它仍然由模型保存在内存中,模型仍然需要从WatchS

我如何才能让a在用户实际可见的情况下只监听它,或者至少在处理相应的文件后让它自己注销

据我所知,JTree从其模型中注销自己的唯一情况是,如果您使用setModel向它传递一个新模型

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


我想最好的方法是创建一个扩展JTree的新类,该类负责向模型注册和从模型中注销。如果是,在显示或释放组件时调用哪些方法?可能addNotify和removeNotify是很好的候选者?

使用JTree的文档:

JTree有一个名为treeModelListener的受保护字段,您可以直接使用JTreeModelListener.removeTreeModelListener从模型中删除该字段。如果要随意从自己的侦听器中删除树模型,请扩展JTree并添加以下方法:

public void unregisterOrWhatever() {
    this.treeModel.removeTreeModelListener(this.treeModelListener);
}

如果您想喜欢监听窗口关闭事件,请在JTree中添加一个HierarchyListener,用于监听HierarchyEvent.PARENT\u更改的事件。无论何时将JTree添加到新窗口,您都可以在窗口关闭时添加WindowListener Unregister或Whatever。当JTree从窗口中删除时,不要忘记也删除WindowListener

树模型?您必须有一个自定义表才能开始。。。JTables有TableModel。哦,我当然是指JTree,不是JTable,我会编辑我的问题,谢谢!:-P