簡體   English   中英

在不可見的JTree上如何注銷JTree?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM