Java AWT(扩展)修饰符何时保证有效?
我正在将AWT事件(Java AWT(扩展)修饰符何时保证有效?,java,swing,awt,mouseevent,Java,Swing,Awt,Mouseevent,我正在将AWT事件(鼠标按下,鼠标释放,按键按下,按键释放,等等)记录到日志中,以便在单元测试中使用Robot重放它们。但我发现,有时当事件丢失时,我需要插入mouse\u released事件,因为我的一些组件在按下mouse\u时会自动删除,因此mouse\u released不会被调度。我认为一个好的方法是,每当看到鼠标事件具有modifiersEx=Button1后接具有modifiersEx=0的事件时,插入mouse\u released,除非第二个事件已经是mouse\u rele
鼠标按下
,鼠标释放
,按键按下
,按键释放
,等等)记录到日志中,以便在单元测试中使用Robot重放它们。但我发现,有时当事件丢失时,我需要插入mouse\u released
事件,因为我的一些组件在按下mouse\u
时会自动删除,因此mouse\u released
不会被调度。我认为一个好的方法是,每当看到鼠标事件具有modifiersEx
=Button1
后接具有modifiersEx
=0的事件时,插入mouse\u released
,除非第二个事件已经是mouse\u release。但是我在使用JComboBox
时发现了一个问题
下面是一个简单的主函数,它包含一个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输入的鼠标\u没有意义,因为它是在鼠标\u释放事件之后调度的!这是我单击组合框,然后单击第一项时的一个简化日志。查看底部的粗体事件:
在MetalComboBoxButton[…]上,鼠标事件[按下鼠标(1,13),按钮=1,修改器=Button1,extModifiers=Button1,点击计数=1]
在MetalComboBoxButton[…]上,鼠标事件[释放鼠标(1,13),按钮=1,修改器=Button1,点击计数=1]
在MetalComboBoxButton[…]上,MouseeEvent[鼠标移动,(0,14),按钮=0,点击计数=0]
MouseeEvent[鼠标退出,(-2,15),按钮=0,单击MetalcomboxButton[…]上的计数=0]
MouseeEvent[在JComboBox[…]上输入鼠标(81,15),按钮=0,点击计数=0]
鼠标事件[鼠标移动,(81,15),按钮=0,点击计数=0]在JComboBox[…]
(更多动作)
鼠标事件[鼠标退出(69,24),按钮=0,点击计数=0]在JComboBox[…]
MouseeEvent[在ComboPopup.popup上输入鼠标(69,0),按钮=0,点击计数=0]
在ComboPopup.popup上MouseeEvent[鼠标移动,(69,0),按钮=0,点击计数=0]
在ComboPopup.popup上,MouseeEvent[鼠标退出,(68,2),按钮=0,点击计数=0]
MouseeEvent[在ComboBox.list上输入鼠标(67,1),按钮=0,点击计数=0]
ComboBox.list上的MouseeEvent[鼠标移动,(67,1),按钮=0,点击计数=0]
(更多动作)
ComboBox.list上的MouseEvent[按下鼠标(57,9),按钮=1,修改器=Button1,extModifiers=Button1,点击计数=1]
ComboBox.list上的MouseeEvent[释放鼠标(57,9),按钮=1,修改器=Button1,点击计数=1]
鼠标事件[鼠标输入,(25,10),按钮=1,修改器=Button1,extModifiers=Button1,点击计数=1]在JButton[…]
鼠标事件[鼠标移动,(26,10),按钮=0,点击计数=0]在JButton[…]
问题:鼠标按下的顺序
/鼠标释放的顺序
与其他鼠标事件的修饰符不一致吗?是否只有mouse\u entered
/mouse\u exited
事件发生时修饰符不一致?这是否仅在单击JComboBox的弹出窗口时发生
我在Ubuntu上运行Java1.6
编辑:为了清晰起见,包含了一个较长的日志。在我的平台上,“单击JComboBox
并单击项目一”生成如下所示的事件
结果可能取决于平台的ComboBoxUI
委托com.apple.laf.aquaComboxButton
。我无法解释您的结果中没有单击鼠标的原因。单击JComboBox
后,我没有移动鼠标;看起来是这样的,结果会被记录下来
请注意,“表示所有模式键的状态,例如事件发生后的ALT
、CTRL
、META
和鼠标按钮”,因此在某些事件上出现的extModifiers
似乎并不一致。我没有看到任何迹象表明事件包含任何修饰符
我不知道潜在问题的解决方案,除了重新检查是否需要一个合成的MOUSE\u RELEASED
事件。作为替代方案,您可以通过检查来验证是否删除了组件
2012年5月11日上午10:36:36 DemoEvents$1 eventDispatched
信息:java.awt.event.MouseEvent[在com.apple.laf.AquaComboBoxButton[…]上按下鼠标(85,9),绝对(124,58),按钮=1,修饰符=Button1,extModifiers=Button1,点击计数=1]
2012年5月11日上午10:36:36 DemoEvents$1 eventDispatched
信息:java.awt.event.MouseEvent[在com.apple.laf.AquaComboBoxButton[…]上发布鼠标(85,9),绝对(124,58),按钮=1,修饰符=Button1,点击计数=1]
2012年5月11日上午10:36:36 DemoEvents$1 eventDispatched
信息:java.awt.event.MouseEvent[在com.apple.laf.AquaComboBoxButton[…]上单击鼠标(85,9),绝对(124,58),按钮=1,修饰符=Button1,点击计数=1]
2012年5月11日上午10:36:38 DemoEvents$1 eventDispatched
信息:java.awt.event.MouseEvent[在ComboBox.list上输入鼠标(91,6),绝对(124,58),按钮=1,修饰符=Button1,extModifiers=Button1,点击计数=1]
2012年5月11日上午10:36:38 DemoEvents$1 eventDispatched
信息:java.awt.event.MouseEvent[在ComboBox.list上按下鼠标(91,6),绝对(124,58),按钮=1,修饰符=Button1,extModifiers=Button1,点击计数=1]
2012年5月11日上午10:36:38 DemoEvents$1 eventDispatched
信息:java.awt.event.MouseEvent[在ComboBox.list上释放鼠标(91,6),绝对(124,58),按钮=1,修饰符=Button1,点击计数=1]
+1。我所指的事件就在您的日志之后,第二次单击之后。在Ubuntu中,在第二个鼠标释放后,输入的鼠标仍然有一个修改器。好的,每次按下的鼠标都有extModifiers
,但我在鼠标输入的上看到它,只是在拖动鼠标的过程中,即当鼠标按钮仍然按下时。我不知道在*nix p上发生了什么
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