java - 如何关闭 JDialog 并通知窗口事件监听器?

标签 java swing jdialog

有没有办法通过代码关闭 JDialog 以便仍会通知 Window 事件监听器?我尝试将可见设置为 false 并进行处理,但似乎都没有这样做。

最佳答案

关闭一个窗口(使用 dispose())和隐藏它(使用 setVisible(false))是不同的操作,并产生不同的事件 - 并从操作系统是另一个产生不同事件的不同操作。

这三个都会产生 windowDeactivated 来告诉你窗口失去焦点,但是 dispose() 然后会产生 windowClosed,同时从操作系统将首先产生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,但它可能比它的值(value)更麻烦。

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

请注意,当您处理一个窗口时,您会得到几个 HierarchyEvent,首先用于隐藏,然后用于失效,但是当您使用 setVisible() 隐藏它时> 它仍然有效,所以你不会得到失效。

关于java - 如何关闭 JDialog 并通知窗口事件监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1343542/

相关文章:

Java,我怎样才能弹出一个只有图像的对话框?

java - java中如何将段落的每个句子存储在字符串中?

java - 如何使用 Datalog 查询接口(interface)公开巨大的语义图(链接数据)

java - 无法删除 JLabel (Netbeans)

java - 使用旧实例的paintComponent

java - 如何在矩形内写文字

java - Jframe 中有 2 个 Jdialogs 的 setModal 问题

java - 从 ArrayList#1 中删除出现在另一个 ArrayList#2 中并且在 ArrayList#1 中不唯一的行

java - 如何使用 Smack 将 XMPP 消息从 Android 发送到 GAE

java - 未修饰的 JDialog 边框