【问题标题】:Check what triggered WindowClosing event检查是什么触发了 WindowClosing 事件
【发布时间】:2014-11-08 15:26:16
【问题描述】:

有没有办法在 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()。这会导致 methodA() 被调用两次,我不希望这样。

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

        }
    }

所以我想解决问题的方法是检查一个名为“确认”的特定按钮是否是触发关闭事件的按钮。然后我不想调用 methodA() 以免它被调用两次。

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

谢谢

【问题讨论】:

  • //this will trigger window closing and call methodA() again 设置一个布尔标志alreadyDoneMethodA 并在调用methodA 之前检查它是否为假,然后在完成后将其设置为真。
  • @AndrewThompson 嗯,好吧,没想到。如果一切都失败了,我会尝试的。但是,有没有办法检查哪个按钮调用了该事件?
  • “有没有办法检查哪个按钮调用了事件?” 您可以创建一个堆栈跟踪并迭代跟踪的元素以查看代码行命中在到达那里之前。但这将是一个 hack.. “没想到这一点。如果一切都失败了,我会尝试。”您似乎想在按照可能的方式进行操作之前调查这些 hack在许多其他程序中完成。

标签: java swing events jframe


【解决方案1】:

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

恕我直言,这里有一个与每个组件的责任相关的设计错误,因为Close 按钮应该只做它应该做的事情:关闭框架。或者甚至更好地发送一个WINDOW_CLOSING 事件,让WindowListener 做它必须做的任何事情。

如果您需要确保在关闭顶级容器(窗口)之前调用了methodA(),那么WindowListener 听起来是调用该方法的合适人选。我会将默认关闭操作设置为DO_NOTHING_ON_CLOSE,并让侦听器在满足必要条件时才释放窗口。

请参阅此方法示例 here 并考虑以下 sn-p:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 2011-06-11
    相关资源
    最近更新 更多