如何关闭 JDialog 并通知窗口事件侦听器?

2022-09-01 07:38:30

有没有办法通过代码关闭 JDialog,以便窗口事件侦听器仍会收到通知?我尝试过将可见设置为虚假和处置,但似乎都没有这样做。


答案 1

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

这三者都将产生以告诉您窗口的焦点丢失,但随后将产生,而从操作系统关闭将首先产生。如果要以相同的方式处理这两个窗口,则可以将窗口设置为在关闭时释放:windowDeactivateddispose()windowClosedwindowClosing

window.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

通常,意味着您可能希望再次使用该窗口,因此它不会发布任何窗口事件(除了 )。如果要检测窗口的隐藏,则需要使用setVisible(false)windowDeactivatedComponentListener;

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());
      }
  });

请注意,当您释放窗口时,您将获得几个窗口,首先是隐藏,然后是无效,但是当您隐藏它时,它仍然有效,因此您不会获得无效。HierarchyEventsetVisible()


答案 2

我似乎没有你的问题。当我使用下面的代码时,windowDeactivated()被调用为setVisible(false)dispose(),windowClosed()也被调用为dispose()。

结束对话框.java:

public class ClosingDialog extends JDialog {
    public ClosingDialog(Frame owner, String title, boolean modal) {
        super(owner, title, modal);
        JPanel contentPanel = (JPanel) this.getContentPane();

        JButton setVisButton = new JButton("setVisible( false )");
        setVisButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                ClosingDialog.this.setVisible(false);
            }
        });

        JButton disposeButton = new JButton("dispose()");
        disposeButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                ClosingDialog.this.dispose();
            }
        });

        contentPanel.setLayout(new FlowLayout());

        contentPanel.add(setVisButton);
        contentPanel.add(disposeButton);

        this.addWindowListener(new WindowListener() {
            public void windowActivated(WindowEvent e) {
                System.out.println("windowActivated");
            }

            public void windowClosed(WindowEvent e) {
                System.out.println("windowClosed");
            }

            public void windowClosing(WindowEvent e) {
                System.out.println("windowClosing");
            }

            public void windowDeactivated(WindowEvent e) {
                System.out.println("windowDeactivated");
            }

            public void windowDeiconified(WindowEvent e) {
                System.out.println("windowDeiconified");
            }

            public void windowIconified(WindowEvent e) {
                System.out.println("windowIconified");
            }

            public void windowOpened(WindowEvent e) {
                System.out.println("windowOpened");
            }
        });

        this.setSize(300, 300);
    }
}

推荐