我正在将 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
.
这是一个简单的 main 函数,其中包含一个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
并单击项目“一”时,我得到了这些事件。with extModifiers mouse_entered
=Button1 没有意义,因为它是在mouse_released event
! 这是我单击组合框然后单击第一项时的简化日志。查看底部加粗的事件:
- MouseEvent[MOUSE_PRESSED,(1,13),button=1,modifiers=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),button=0,clickCount=0] 在 MetalComboBoxButton[...]
- MouseEvent[MOUSE_ENTERED,(81,15),button=0,clickCount=0] 在 JComboBox[...]
- MouseEvent[MOUSE_MOVED,(81,15),button=0,clickCount=0] 在 JComboBox[...]
- (更多动作)
- MouseEvent[MOUSE_EXITED,(69,24),button=0,clickCount=0] 在 JComboBox[...]
- ComboPopup.popup 上的 MouseEvent[MOUSE_ENTERED,(69,0),button=0,clickCount=0]
- ComboPopup.popup 上的 MouseEvent[MOUSE_MOVED,(69,0),button=0,clickCount=0]
- ComboPopup.popup 上的 MouseEvent[MOUSE_EXITED,(68,2),button=0,clickCount=0]
- ComboBox.list 上的 MouseEvent[MOUSE_ENTERED,(67,1),button=0,clickCount=0]
- ComboBox.list 上的 MouseEvent[MOUSE_MOVED,(67,1),button=0,clickCount=0]
- (更多动作)
- MouseEvent[MOUSE_PRESSED,(57,9),button=1,modifiers=Button1,extModifiers=Button1,clickCount=1] 在 ComboBox.list
- ComboBox.list 上的 MouseEvent[MOUSE_RELEASED,(57,9),button=1,modifiers=Button1,clickCount=1]
- MouseEvent[MOUSE_ENTERED,(25,10),button=1,modifiers=Button1, extModifiers=Button1 ,clickCount=1] 在 JButton[...]
- MouseEvent[MOUSE_MOVED,(26,10),button=0,clickCount=0] 在 JButton[...]
问题:什么时候mouse_pressed
/的顺序mouse_released
与其他鼠标事件的修饰符不一致?是否只有mouse_entered
/mouse_exited
事件发生在修饰符不一致的情况下?这仅在单击JComboBox
弹出窗口时发生吗?
我在 Ubuntu 上运行 Java 1.6。
编辑:为清楚起见,包括更长的日志。