我目前正在制作我的第一个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){
[...]
}
}
答案 0 :(得分:2)
mouseClicked
。如果在释放鼠标之前键入键,则在调用mouseClicked之前将触发InputMap。
要在按下键之前注册鼠标,无论鼠标按钮是否已被释放,请将代码放在mousePressed
而不是鼠标点击。