2017-11-12 5 views
1

私は現在、私の最初のGUIプログラムに取り組んでおり、解決方法がわからないという問題が1つあります - 私は以下の最小限のコンパイル可能な例を提供しました。Javaコードのキーボード/マウスイベントのタイミング問題

activeElementを変更する必要があるマウスをクリックした直後に削除キーを押すと、activeElementが新しい値に変更される前にキーアクションが実行されることがあるという問題があります。コードactionPerformedactiveElementmouseClickedで変更するのを待っていることを確認するにはどうすればよいですか?


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

不要になったら値を 'null'にリセットしてください。 – MadProgrammer

+0

@MadProgrammer' paint'メソッドとそれに続くキーストロークには必要ありません。主な質問は、「キーストロークがクリックに近づくと、キーストロークが有効になる前に 'mouseClicked'が実行されることを確認するにはどうすればよいですか? –

+0

actionPerformedメソッドの本体を[EventQueue.invokeLater](https://docs.oracle.com/javase/9​​/docs/api/java/awt/EventQueue.html#invokeLater-)に囲まれていれば十分でしょう。 java.lang.Runnable-)、保留中のすべての入力イベントが処理された後に実行されます。 – VGR

答えて

2

mouseClickedあなたが押され、(ほぼ)同じ場所でマウスをリリースした後に呼び出されます。マウスを離す前にキーを入力すると、mouseClickedが呼び出される前にInputMapがトリガーされます。

キーを押す前にマウスを押して登録するには、マウスボタンが離されているかどうかにかかわらず、mouseClickedではなくmousePressedにコードを置きます。

関連する問題