检查触发WindowClosing事件的内容

时间:2014-11-08 15:26:17

标签: java swing events jframe

有没有办法查看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

        }
    }

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

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

由于

1 个答案:

答案 0 :(得分:3)

  

我想知道这是因为dispose()方法触发了一个WindowClosing事件。因此,如果单击一个按钮调用methodA()   然后dispose(),dispose()触发一个关闭事件   定义为调用methodA()。这会导致调用methodA()   两次,我不想要那样。

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

如果您需要确保在关闭顶级容器(窗口)之前methodA()被称为,那么WindowListener听起来就像是调用该方法的合适人选。我将默认关闭操作设置为DO_NOTHING_ON_CLOSE,当且仅当满足必要条件时,让侦听器处理窗口。

请参阅此示例here,并考虑以下代码段:

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