如何关闭JDialog并通知Window事件监听器?

Jef*_*rey 33 java swing jdialog

有没有办法通过代码关闭JDialog,以便仍然会通知Window事件监听器?我试过将可见设置为假和处理,但似乎都没有.

Dav*_*les 48

关闭一个窗口(with dispose())并将其隐藏(with setVisible(false))是不同的操作,并产生不同的事件 - 从操作系统关闭它是另一个产生不同事件的不同操作.

所有这三个都会产生windowDeactivated告诉你窗口失去焦点,但dispose()随后会产生windowClosed,而从操作系统关闭将首先产生windowClosing.如果要以相同的方式处理这两种方法,可以将窗口设置为在关闭时处理:

window.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
Run Code Online (Sandbox Code Playgroud)

通常,setVisible(false)暗示您可能希望再次使用该窗口,因此它不会发布任何窗口事件(除此之外windowDeactivated).如果要检测窗口的隐藏,则需要使用ComponentListener;

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

请注意,这几乎只适用于显式setVisible()调用.如果你需要更普遍地检测隐藏,你可以使用a HierarchyListener,但它可能比它的价值更麻烦.

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

请注意,当你处理一个窗口时,你会得到几个HierarchyEvents,首先是隐藏然后是为了失效,但是当你隐藏它时setVisible()它仍然有效,所以你不会得到失效.

  • 谢谢大卫.我只是在使用dispose时正在监听windowClosing.我没有意识到只有操作系统关闭它产生窗口关闭. (3认同)