有没有办法查看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)按钮是否是调用窗口关闭事件的按钮?
由于
答案 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();
}
});