2017-12-20 2 views
2

ビューが破棄された(ステージが閉じられ、別のビューがその場所に置かれたなど)、コントローラ上で呼び出されるメソッドはありますか?つまり、への対応があります:@FXMLに対応するものが初期化されていますか?

@FXML 
private void initialize() 

更新:私はこれをやっている理由は、私のアプリケーションがPubNubからメッセージを受信して​​いることですし、それらのメッセージは、彼らので、これらのコントローラに中継する必要があります(ビューのサイズなどの内部コントローラ情報に依存するかどうか)を選択できます。

私はこれらのコントローラをグローバルリストに登録し、破壊された場合は登録を解除する予定でした。

+0

いいえ、そのような方法はありません。 –

+0

私はそうは思わない... – zlakad

+1

本当の質問は、なぜ、その部分がもう利用できないときに、いくつかのUI部分のコントローラを使うべきなのだろうか? @パブロ - あなたはこの質問に何か答えを与えることができますか? – zlakad

答えて

2

ほとんどのコメントから、JavaFXにはそのような機能はないことが伝えられています。 James_DWeakReferenceを使用していますが、これはあなたの問題の良い解決策だと思います。

public final class PubNubManager { 
    private final List<WeakReference<PubNubListener>> listeners = new ArrayList<>(); 

    // Other standard singleton stuff 

    public void informListeners(PubNubData data) { 
     listeners.stream().forEach(listenerRef -> { 
      if (listenerRef.get() != null) 
       listenerRef.get().receiveData(data); 
     }); 

     // You can remove weakreference that are no longer valid, or stop getting for data when there are no more listener. 
    } 

    public void registerListener(PubNubListener listener) { 
     if (listener != null) 
      listeners.add(new WeakReference<>(listener)); 
    } 

    // You can make one to unregister too if you want. 
} 

public interface PubNubListener { 
    void receiveData(PubNubData data); 
} 

public class ControllerA implements PubNubListener { 
    @Override 
    public void receiveData(PubNubData data) { 
     // What you need to do 
    } 
} 
+0

ニースのデモ。いくつかのコメント。これは、コントローラへの参照を保持するビューに依存します。コントローラに、FXMLファイルで定義された1つ以上のUI要素で登録された何らかの種類のイベントリスナーがある場合、これは自然に発生します。コントローラーが通知でUIを更新するためにのみ存在する場合は、範囲外になりすぎて通知が停止する可能性があります。逆に、コントローラが有効範囲外になった後、弱参照が無効になった場合、または弱参照が無効になることは保証されません。したがって、これはメモリリークを防ぐために機能しますが、通知は無期限に続行されます。 –

+0

@James_D true。このソリューションは、ビューとコントローラが一緒にガベージコレクションされ、範囲外になるとすぐに理想的な世界にいればうまく機能するようです。私は最も安全な方法はまだコントローラの 'ステージ'の参照を取得し、ウィンドウの隠されたイベントを聞いて、次に手動でマネージャから登録を解除することだと思います。 – Jai

+0

私はそれがリスナーの登録を解除する動機にかかっていると思います。それ以外の方法で使用されていないコントローラ(メモリリークを防止する)に不要な参照が保持されていないことを確認するだけであれば、この方法で十分です。 OPがCPUパフォーマンスの観点から影響を及ぼさないコード(通知)を実行することに懸念がある場合、これは必要なことを行いません。 (私は実際に後者が実際の問題であると想像するのは難しいと思う。) –

関連する問題