1

JTree実際にユーザーに表示されている間だけ聞く、TreeModelまたは少なくとも対応するものが破棄されるとすぐに登録を解除するにはどうすればよいJFrameですか?

私が見る限り、 aJTreeがそのモデルから自身を登録解除する唯一のケースは、( を使用して) 新しいモデルを渡した場合ですsetModel(…)

これにより、モデルが別の場所から参照されている場合、ツリーがガベージ コレクションされません。例:ファイル システム ツリーのモデルを常に最新の状態にするために、TreeModelを使用してを実装しました。WatchServiceモデルのリスナーが 1 つであっても、WatchServiceファイル システムの変更についてモデルに通知し続ける必要があるため、ガベージ コレクションを実行することはできません。そのため、JTreeが表示されなくなったとしても、 から更新を取得する必要があるモデルによって引き続きメモリに保持されますがWatchService、これはもはや必要ありません。

JTreeモデルへの登録と登録解除を行う新しいクラス拡張を作成するのが最善の方法だと思います。その場合、コンポーネントが表示または破棄されるときにどのメソッドが呼び出されますか? おそらくaddNotify()そしてremoveNotify()良い候補ですか?

4

1 に答える 1

0

JTree のドキュメントを使用: http://docs.oracle.com/javase/7/docs/api/javax/swing/JTree.html

JTreetreeModelListenerには、を使用してモデルから直接削除できるという保護されたフィールドがありますJTreeModelListener.removeTreeModelListener()。独自のリスナーからツリー モデルを自由に削除する場合はJTree、次のメソッドを拡張して追加します。

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

ウィンドウを閉じるイベントをリッスンすることに慣れたい場合は、イベントをリッスンする に a を追加HierarchyListenerします。JTree が新しいウィンドウに追加されるたびに、ウィンドウが閉じられたときに を追加できます。をウィンドウから取り外すときは、も忘れずに取り外してください。JTreeHierarchyEvent.PARENT_CHANGEDWindowListener unregisterOrWhateverWindowListenerJTree

于 2013-12-04T22:47:44.323 に答える