2012-05-11 71 views
3

我正在將AWT事件(mouse_pressed,mouse_released,key_pressed,key_released等)記錄到日誌中,以便在單元測試中使用Robot進行回放。但是我發現我有時需要在缺失事件時插入mouse_released事件,因爲我的一些組件在mouse_pressed上自行刪除,因此從未分派mouse_released。我認爲一個好的方法是插入mouse_released,只要看到的鼠標事件有modifiersEx = Button1,然後是modifiersEx = 0的事件,除非第二個事件已經是mouse_released。但使用JComboBox時發現問題。什麼時候AWT(擴展)修飾符保證有效?

下面是一個簡單的主函數,其中包含一個JComboBox,它下面還有一個組件,它也接收鼠標事件。

Screenshot of window with JComboBox

import java.awt.AWTEvent; 
import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.Toolkit; 
import java.awt.event.AWTEventListener; 
import java.awt.event.InputEvent; 
import java.util.logging.Logger; 

import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class DemoEvents { 
    public static void main(String[] argv) { 
     JFrame jframe = new JFrame("Test events"); 
     jframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     Container contentPane = jframe.getContentPane(); 
     contentPane.setLayout(new BorderLayout()); 
     JComboBox jcomboBox = new JComboBox(new String[]{"one", "two", "three"}); 
     JButton jbutton = new JButton("Hello"); 
     JPanel outerPanel = new JPanel(); 
     JPanel innerPanel = new JPanel(); 
     innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.PAGE_AXIS)); 
     innerPanel.add(jcomboBox); 
     innerPanel.add(jbutton); 
     outerPanel.add(innerPanel); 
     contentPane.add(outerPanel, BorderLayout.CENTER); 
     jframe.setSize(200, 200); 
     jframe.setVisible(true); 

     long mask = 
      AWTEvent.MOUSE_EVENT_MASK | 
      AWTEvent.MOUSE_WHEEL_EVENT_MASK | 
      AWTEvent.MOUSE_MOTION_EVENT_MASK; 

     final Logger logger = Logger.getLogger("awt-events"); 
     Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() { 
      @Override 
      public void eventDispatched(AWTEvent event) { 
       InputEvent ev = (InputEvent)event; 
       logger.info(ev.toString()); 
      } 
     }, mask); 
    } 
} 

當在JComboBox點擊和點擊項目 「一」,我得到這些事件。帶有extModifiers = Button1的mouse_entered沒有意義,因爲它在mouse_released event之後被派遣!這是我單擊組合框時的簡化日誌,然後單擊第一個項目。看粗體事件在底部:

  1. 的MouseEvent [MOUSE_PRESSED,(1,13),按鈕= 1,改性劑= Button1的,extModifiers = Button1的,的clickCount = 1] MetalComboBoxButton [...]
  2. MouseEvent [MOUSE_RELEASED,(1,13),button = 1,modifiers = Button1,clickCount = 1] on MetalComboBoxButton [...]
  3. MouseEvent [MOUSE_MOVED,(0,14),button = 0,clickCount = 0 ]上MetalComboBoxButton [...]
  4. 的MouseEvent [MOUSE_EXITED,( - 2,15),按鈕= 0,的clickCount = 0] MetalComboBoxButton [...]
  5. 的MouseEvent [MOUSE_ENTERED,(81,15),按鈕= 0,clickCoun T = 0]上的JComboBox [...]
  6. 的MouseEvent [MOUSE_MOVED,(81,15),按鈕= 0,的clickCount = 0]上的JComboBox [...]
  7. (更多的動作)
  8. 的MouseEvent ComboBox上的[MOUSE_EXITED,(69,24),button = 0,clickCount = 0]
  9. ComboPopup.popup上的MouseEvent [MOUSE_ENTERED,(69,0),button = 0,clickCount = 0]
  10. 的MouseEvent [MOUSE_MOVED,(69.0),按鈕= 0,的clickCount = 0] ComboPopup.popup
  11. 的MouseEvent [MOUSE_EXITED,(68,2),按鈕= 0,的clickCount = 0]上ComboPopup.popup
  12. MouseEven T [MOUSE_ENTERED,(67,1),按鈕= 0,的clickCount = 0] ComboBox.list
  13. 的MouseEvent [MOUSE_MOVED,(67,1),按鈕= 0,的clickCount = 0] ComboBox.list
  14. (更多的動作)
  15. 的MouseEvent [MOUSE_PRESSED,(57,9),按鈕= 1,改性劑= Button1的,extModifiers = Button1的,的clickCount = 1] ComboBox.list
  16. 的MouseEvent [MOUSE_RELEASED,(57,9),按鈕= 1,改性劑= Button1的,的clickCount = 1] ComboBox.list
  17. 的MouseEvent [MOUSE_ENTERED,(25,10),按鈕= 1,改性劑= Button1的,extModifiers = Button1的,的clickCount = 1]的JButton [ ...]
  18. 的MouseEvent [MOUSE_MOVED,(26,10),按鈕= 0,的clickCount = 0]上的JButton [...]

問題:當爲mouse_pressed/mouse_released與所述改性劑不一致的順序其他鼠標事件?是否只有mouse_entered/mouse_exited事件發生不一致的修飾符?只有在點擊JComboBox的彈出窗口時纔會發生這種情況嗎?

我在Ubuntu上運行Java 1.6。

編輯:包括一個更長的日誌清晰。

+0

+1 [sscce](http://sscce.org/)。 – trashgod

回答

1

在我的平臺上,「點擊JComboBox並單擊項目一個」生成下面顯示的事件。

結果可能取決於com.apple.laf.AquaComboBoxButton,該平臺的代表爲ComboBoxUI。我無法解釋您的結果中缺少MOUSE_CLICKED。點擊JComboBox後,我沒有移動鼠標;看起來你做了,而且結果被記錄下來。

注意,「Extended modifiers表示所有模式鍵的狀態,如​​,CTRLMETA,以及鼠標按鈕,這樣的事件發生,」這樣的extModifiers對一些事件的存在似乎並不矛盾。我沒有看到任何跡象表明MOUSE_MOVED事件包含任何修飾符。

我不知道一個解決方案的基本問題,除了重新審查合成MOUSE_RELEASED事件的需要。作爲替代方法,您可以通過檢查containment hierarchy來驗證組件是否被移除。

 
May 11, 2012 10:36:36 AM DemoEvents$1 eventDispatched 
INFO: java.awt.event.MouseEvent[MOUSE_PRESSED,(85,9),absolute(124,58),button=1,modifiers=Button1,extModifiers=Button1,clickCount=1] on com.apple.laf.AquaComboBoxButton[…] 
May 11, 2012 10:36:36 AM DemoEvents$1 eventDispatched 
INFO: java.awt.event.MouseEvent[MOUSE_RELEASED,(85,9),absolute(124,58),button=1,modifiers=Button1,clickCount=1] on com.apple.laf.AquaComboBoxButton[…] 
May 11, 2012 10:36:36 AM DemoEvents$1 eventDispatched 
INFO: java.awt.event.MouseEvent[MOUSE_CLICKED,(85,9),absolute(124,58),button=1,modifiers=Button1,clickCount=1] on com.apple.laf.AquaComboBoxButton[…] 
May 11, 2012 10:36:38 AM DemoEvents$1 eventDispatched 
INFO: java.awt.event.MouseEvent[MOUSE_ENTERED,(91,6),absolute(124,58),button=1,modifiers=Button1,extModifiers=Button1,clickCount=1] on ComboBox.list 
May 11, 2012 10:36:38 AM DemoEvents$1 eventDispatched 
INFO: java.awt.event.MouseEvent[MOUSE_PRESSED,(91,6),absolute(124,58),button=1,modifiers=Button1,extModifiers=Button1,clickCount=1] on ComboBox.list 
May 11, 2012 10:36:38 AM DemoEvents$1 eventDispatched 
INFO: java.awt.event.MouseEvent[MOUSE_RELEASED,(91,6),absolute(124,58),button=1,modifiers=Button1,clickCount=1] on ComboBox.list 
+0

我所指的事件就是在你的日誌之後,第二次點擊之後。在Ubuntu中,第二個mouse_released之後有一個mouse_entered,它仍然有一個修飾符。 – yonran

+0

好的,每個'MOUSE_PRESSED'都有'extModifiers',但是我只在'MOUSE_DRAGGED'期間看到它在'MOUSE_ENTERED',即鼠標按鈕仍然關閉。 – trashgod

+0

我不知道* nix平臺發生了什麼事情+1 – mKorbel

相關問題