Java代码中的键盘/鼠标事件计时问题

时间:2017-11-12 21:01:33

标签: java swing user-interface synchronization mouseevent

我目前正在制作我的第一个GUI程序,还有一个我不知道如何解决的问题 - 我在下面提供了一个最小的(不可编译的)示例。

问题是,在某些情况下,如果在鼠标单击后不久按下删除键,应该更改activeElement,则会在activeElement更改为新值之前执行关键操作。如何确保actionPerformed中的代码等待activeElement更改mouseClicked

public class Problem extends JPanel implements MouseListener{
    Element activeElement = null;

    public Problem(){
        super();
        this.addMouseListener(this);
        InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
        ActionMap am = getActionMap();
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0),"test");
        am.put("test",new AbstractAction(){
            @Override
            public void actionPerformed(ActionEvent ae){
                if(activeElement!=null){
                    doSomethingWith(activeElement);
                    repaint();
                }
            }
        });
    }

    @Override
    public void mouseClicked(MouseEvent me){
        activeElement = getElementByCoordinates(me.getX(),me.getY());
    }

    private Element getElementByCoordinates(int x, int y){
        [...]
    }

    private void doSomethingWith(Element e){
        [...]
    }
}

1 个答案:

答案 0 :(得分:2)

按下并在(几乎)相同位置释放鼠标后,将调用

mouseClicked。如果在释放鼠标之前键入键,则在调用mouseClicked之前将触发InputMap。

要在按下键之前注册鼠标,无论鼠标按钮是否已被释放,请将代码放在mousePressed而不是鼠标点击。