繁体   English   中英

检查触发WindowClosing事件的内容

[英]Check what triggered WindowClosing event

有没有办法看到在JFrame中究竟触发了什么触发了WindowClosing事件? 目前getSource(),它似乎只返回JFrame:

public void windowClosing(WindowEvent e) {
      JOptionPane.showMessageDialog(null, "event source: " + e.getSource(), "Test", JOptionPane.OK_OPTION);
      methodA();
            } 

由于方法dispose()触发WindowClosing事件,我想知道这一点。 因此,如果单击一个按钮调用methodA()然后调用dispose(),dispose()将触发一个结束事件,该事件定义为调用methodA()。 这会导致方法A()被调用两次,我不希望这样。

public void actionPerformed(ActionEvent e) {
        if (e.getSource() == confirmButton) {
            methodA();
            dispose(); //this will trigger window closing and call methodA() again

        }
    }

因此,我想解决问题的方法是检查名为“确认”的特定按钮是否是触发结束事件的按钮。 然后我不想调用methodA(),因此它不会被调用。

如果这是不可能的,我至少可以检查框架中的关闭(X)按钮是否是调用窗口关闭事件的按钮?

谢谢

由于方法dispose()触发WindowClosing事件,我想知道这一点。 因此,如果单击一个按钮调用methodA()然后调用dispose(),dispose()将触发一个结束事件,该事件定义为调用methodA()。 这会导致方法A()被调用两次,我不希望这样。

恕我直言,这里的设计错误与每个组件的责任有关,因为Close按钮应该按照预期的方式执行:关闭框架。 或者甚至更好地调度WINDOW_CLOSING事件,让WindowListener做任何必须完成的事情。

如果你需要确保关闭顶级容器(窗口) 之前调用methodA()那么WindowListener听起来像是调用该方法的正确候选者。 我将默认关闭操作设置为DO_NOTHING_ON_CLOSE并且当且仅当满足必要条件时,让侦听器配置窗口。

请参阅此处举例说明的此方法并考虑以下代码段:

JButton closeButton = new JButton("Close");
closeButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        Window window = SwingUtilities.windowForComponent((JButton)e.getSource());
        window.dispatchEvent(new WindowEvent(window, WindowEvent.WINDOW_CLOSING));
    }
});

...

JFrame frame = new JFrame("Frame");
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.addWindowListener(new WindowAdapter() {

    @Override
    public void windowClosing(WindowEvent e) {
        // Call methodA() here.
        // If all went ok then dispose the window, otherwise log the 
        // errors/exceptions and notify the user that something went wrong.
        e.getWindow().dispose();
    }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM