Java 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

我正在将AWT事件(
鼠标按下
鼠标释放
按键按下
按键释放
,等等)记录到日志中,以便在单元测试中使用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