我正在將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
,它下面還有一個組件,它也接收鼠標事件。
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
之後被派遣!這是我單擊組合框時的簡化日誌,然後單擊第一個項目。看粗體事件在底部:
- 的MouseEvent [MOUSE_PRESSED,(1,13),按鈕= 1,改性劑= Button1的,extModifiers = Button1的,的clickCount = 1] MetalComboBoxButton [...]
- MouseEvent [MOUSE_RELEASED,(1,13),button = 1,modifiers = Button1,clickCount = 1] on MetalComboBoxButton [...]
- MouseEvent [MOUSE_MOVED,(0,14),button = 0,clickCount = 0 ]上MetalComboBoxButton [...]
- 的MouseEvent [MOUSE_EXITED,( - 2,15),按鈕= 0,的clickCount = 0] MetalComboBoxButton [...]
- 的MouseEvent [MOUSE_ENTERED,(81,15),按鈕= 0,clickCoun T = 0]上的JComboBox [...]
- 的MouseEvent [MOUSE_MOVED,(81,15),按鈕= 0,的clickCount = 0]上的JComboBox [...]
- (更多的動作)
- 的MouseEvent ComboBox上的[MOUSE_EXITED,(69,24),button = 0,clickCount = 0]
- ComboPopup.popup上的MouseEvent [MOUSE_ENTERED,(69,0),button = 0,clickCount = 0]
- 的MouseEvent [MOUSE_MOVED,(69.0),按鈕= 0,的clickCount = 0] ComboPopup.popup
- 的MouseEvent [MOUSE_EXITED,(68,2),按鈕= 0,的clickCount = 0]上ComboPopup.popup
- MouseEven T [MOUSE_ENTERED,(67,1),按鈕= 0,的clickCount = 0] ComboBox.list
- 的MouseEvent [MOUSE_MOVED,(67,1),按鈕= 0,的clickCount = 0] ComboBox.list
- (更多的動作)
- 的MouseEvent [MOUSE_PRESSED,(57,9),按鈕= 1,改性劑= Button1的,extModifiers = Button1的,的clickCount = 1] ComboBox.list
- 的MouseEvent [MOUSE_RELEASED,(57,9),按鈕= 1,改性劑= Button1的,的clickCount = 1] ComboBox.list
- 的MouseEvent [MOUSE_ENTERED,(25,10),按鈕= 1,改性劑= Button1的,extModifiers = Button1的,的clickCount = 1]的JButton [ ...]
- 的MouseEvent [MOUSE_MOVED,(26,10),按鈕= 0,的clickCount = 0]上的JButton [...]
問題:當爲mouse_pressed
/mouse_released
與所述改性劑不一致的順序其他鼠標事件?是否只有mouse_entered
/mouse_exited
事件發生不一致的修飾符?只有在點擊JComboBox
的彈出窗口時纔會發生這種情況嗎?
我在Ubuntu上運行Java 1.6。
編輯:包括一個更長的日誌清晰。
+1 [sscce](http://sscce.org/)。 – trashgod