JDialog を閉じてウィンドウ イベント リスナーに通知するにはどうすればよいでしょうか? 質問する

JDialog を閉じてウィンドウ イベント リスナーに通知するにはどうすればよいでしょうか? 質問する

Window イベント リスナーに通知が届くように、コードを通じて JDialog を閉じる方法はありますか? visible を false に設定して破棄してみましたが、どちらもうまくいかないようです。

ベストアンサー1

ウィンドウを閉じること ( を使用dispose()) と非表示にすること ( を使用setVisible(false)) は異なる操作であり、異なるイベントが生成されます。また、オペレーティング システムからウィンドウを閉じることも、異なる操作であり、異なるイベントが生成されます。

windowDeactivatedこれら3つはウィンドウのフォーカスが失われたことを通知するためにを生成し、dispose()その後 を生成しますwindowClosed。OSから閉じる場合は初めこれら両方を同じように処理したい場合windowClosingは、閉じたときにウィンドウが破棄されるように設定できます。

window.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

一般的に、setVisible(false)はウィンドウを再度使用する可能性があることを意味しているため、ウィンドウ イベントはポストされません ( を除くwindowDeactivated)。ウィンドウの非表示を検出する場合は、 を使用する必要がありますComponentListener

window.addComponentListener(new ComponentAdapter() {
  @Override
  public void componentHidden(ComponentEvent e) {
    System.out.println("componentHidden()");
  }
})

ただし、これは明示的な呼び出しに対してのみ機能することに注意してくださいsetVisible()。より一般的に隠蔽を検出する必要がある場合は を使用できますHierarchyListenerが、おそらく手間がかかるでしょう。

  window.addHierarchyListener(new HierarchyListener() {
    @Override
      public void hierarchyChanged(HierarchyEvent e) {
        System.out.println("valid: " + window.isValid());
        System.out.println("showing: " + window.isShowing());
      }
  });

ウィンドウを破棄するときに、HierarchyEvent最初は非表示、次に無効化の 2 つの が返されますが、 で非表示にするとウィンドウはsetVisible()有効なままなので、無効化は発生しないことに注意してください。

おすすめ記事