2014-11-08 48 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(); 
    } 
}); 
相關問題