![](/img/trans.png)
[英]Why does JTree handle events from DefaultTreeModel but not TreeModel?
[英]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.