[英]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.