1
私は現在、私の最初のGUIプログラムに取り組んでおり、解決方法がわからないという問題が1つあります - 私は以下の最小限のコンパイル可能な例を提供しました。Javaコードのキーボード/マウスイベントのタイミング問題
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){
[...]
}
}
不要になったら値を 'null'にリセットしてください。 – MadProgrammer
@MadProgrammer' paint'メソッドとそれに続くキーストロークには必要ありません。主な質問は、「キーストロークがクリックに近づくと、キーストロークが有効になる前に 'mouseClicked'が実行されることを確認するにはどうすればよいですか? –
actionPerformedメソッドの本体を[EventQueue.invokeLater](https://docs.oracle.com/javase/9/docs/api/java/awt/EventQueue.html#invokeLater-)に囲まれていれば十分でしょう。 java.lang.Runnable-)、保留中のすべての入力イベントが処理された後に実行されます。 – VGR