gpt4 book ai didi

java - 当 JTree 不可见时,如何从 TreeModel 取消注册 JTree?

转载 作者:太空宇宙 更新时间:2023-11-04 15:21:03 25 4
gpt4 key购买 nike

如何获得 JTree只听其TreeModel虽然它实际上对用户可见,或者至少让它在相应的 JFrame 后立即取消注册。被处置了吗?

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

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

我想最好的方法是创建一个扩展 JTree 的新类,用于在模型中注册和取消注册。如果是这样,当显示或处置组件时会调用哪些方法?也许 addNotify()removeNotify() 是不错的候选者?

最佳答案

使用JTree的文档:http://docs.oracle.com/javase/7/docs/api/javax/swing/JTree.html .

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

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

如果您想监听窗口关闭事件,请向 JTree 添加一个 HierarchyListener 来监听 HierarchyEvent.PARENT_CHANGED 事件。每当 JTree 添加到新窗口时,您都可以在窗口关闭时添加 WindowListener unregisterOrWhatever。从窗口中删除 JTree 时,不要忘记同时删除 WindowListener

关于java - 当 JTree 不可见时,如何从 TreeModel 取消注册 JTree?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20387436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com