2014-11-08 49 views
1

有没有办法查看究竟触发了一个JFrame中的WindowClosing事件?目前的getSource(),它似乎只能返回JFrame中:检查什么触发了WindowClosing事件

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(),这样它就不会被调用。

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

感谢

+0

'//这将触发窗口关闭,并调用了methodA()again'设置一个布尔标志'alreadyDoneMethodA'并检查它是假的在调用'methodA'之前,在完成时将其设置为true。 – 2014-11-08 15:28:44

+0

@AndrewThompson恩,好的没有想到这一点。如果一切都失败了,我会尝试。虽然没有办法检查哪个按钮可以调用该事件吗? – sparta123 2014-11-08 15:30:16

+0

*“是否没有办法检查哪个按钮调用了该事件?”*您可以创建一个堆栈跟踪并迭代跟踪的元素以在到达那里之前查看代码行。但那会是一种破坏.. *“没有想到这一点,如果一切都失败了,我会尝试的。”*您似乎希望在按照其他几十种方式进行攻击之前调查黑客行为程式。 – 2014-11-08 15:32:40

回答

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(); 
    } 
}); 
相关问题