2012-03-03 6 views
1

でダブルクリックマウスイベントを生成します。私は次のようにEDTをダブルクリックしてマウスイベントを生成しようとしていたJava Swingの

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     component.dispatchEvent(new MouseEvent(
      component,          
      MouseEvent.MOUSE_CLICKED, 
      System.currentTimeMillis(), 
      InputEvent.BUTTON1_MASK, 
      x, y, 
      2, // click count 
      false 
     )); 
    } 
}); 

これは私がいても、ダブルクリックイベントを送出していないようですクリック数を2に設定してください。

提案や例はありますか?

+2

'component'は何ですか?実際には、それに答える気にしないでください。すぐにより良い助けを得るために、[SSCCE](http://sscce.org/)を投稿してください(これは、私が聞いたかもしれない他の5つの質問のうち4つと答えます)。 –

+1

イベントの偽装は、通常、悪い考えです。ダブルクリックを処理するコードを別のメソッドに移動し、そのメソッドを直接呼び出すのはなぜですか? –

+0

なぜあなたはこれをやっていますか?テスト用ですか? – DNA

答えて

3

考慮:

final JButton clickTwiceButton = new JButton(); 
final JButton fireEventButton = new JButton(); 

リスナー:

clickTwiceButton.addMouseListener(new java.awt.event.MouseAdapter() { 
    public void mouseClicked(java.awt.event.MouseEvent evt) { 
     if (evt.getClickCount() == 2) { 
      JOptionPane.showMessageDialog(null, "Double clicked!"); 
     } 
    } 
}); 

fireEventButton.addActionListener(new java.awt.event.ActionListener() { 
    public void actionPerformed(java.awt.event.ActionEvent evt) { 
     // Invoking later for no reason, just to simulate your code 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       clickTwiceButton.dispatchEvent(new MouseEvent(
        fireEventButton, 
        MouseEvent.MOUSE_CLICKED, 
        1, 
        MouseEvent.BUTTON1, 
        0, 0, 
        2, 
        false 
       )); 
      } 
     }); 
    }   
}); 

私はMouseEventが正しくclickTwiceButtonに派遣し、期待通りのダイアログが表示されますfireEventButtonをクリックします。

@Andrewが指摘しているように、間違ったコンポーネントにイベントを発しているか、登録されているMouseListener/MouseAdapterコードで問題が発生している可能性があります。

component.getMouseListeners()を使用して、コンポーネントのリスナーをチェックし、イベントを処理するコードをデバッグします。

+1

+1は 'EventQueue'を使用します。 @ user1246353も['Robot'](http://docs.oracle.com/javase/7/docs/api/java/awt/Robot.html)の使用を検討する必要があります。 – trashgod

+1

こんにちは@trashgod、もう一度会いに来てうれしいです。ロボットの提案には1+イベントはリスナーから直接ディスパッチされているので、ちょうど1つ(私は新しい質問を開くのが面倒ですが、これはOPの質問に関連していると思います)、とにかく 'EventQueue'でも実行できませんか? 'invokeLater'と' invokeAndWait'がいつ本当に必要なのかは決してわかりません。 –

+1

良い質問:必ずしもそうではありません。私たちはOPの「Runnable」がどのように誘発されているかについては示されていません。 'actionPerformed()'がEDT上で実行されている限り、 'invokeLater()'は 'ActionListener'が完了した後に' MouseEvent'が送出されることを保証します。もっと見ると、私はOPの似たような使い方を見落としたので、@ Overrideに+1しました! – trashgod

0
public class TestMouseListener implements MouseListener {  
     private boolean leftClick; 
     private int clickCount; 
     private boolean doubleClick; 
     private boolean tripleClick; 
     public void mouseClicked(MouseEvent evt) { 
     if (evt.getButton()==MouseEvent.BUTTON1){ 
      leftClick = true; clickCount = 0; 
      if(evt.getClickCount() == 2) doubleClick=true; 
      if(evt.getClickCount() == 3){ 
       doubleClick = false; 
       tripleClick = true; 
      } 
      Integer timerinterval = (Integer)Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval"); 

        Timer timer = new Timer(timerinterval, new ActionListener() { 
         public void actionPerformed(ActionEvent evt) { 

          if(doubleClick){ 
           System.out.println("double click.");          
           clickCount++; 
           if(clickCount == 2){ 
            doubleClick(); //your doubleClick method 
            clickCount=0; 
            doubleClick = false; 
            leftClick = false; 
           } 

          }else if (tripleClick) { 

           System.out.println("Triple Click."); 
           clickCount++; 
           if(clickCount == 3) { 
            tripleClick(); //your tripleClick method 
            clickCount=0; 
            tripleClick = false; 
            leftClick = false; 
           } 

          } else if(leftClick) {          
           System.out.println("single click."); 
           leftClick = false; 
          } 
         }    
        }); 
        timer.setRepeats(false); 
        timer.start(); 
        if(evt.getID()==MouseEvent.MOUSE_RELEASED) timer.stop(); 
     }   
    } 


     public static void main(String[] argv) throws Exception { 

     JTextField component = new JTextField(); 
     component.addMouseListener(new TestMouseListener()); 
     JFrame f = new JFrame(); 

     f.add(component); 
     f.setSize(300, 300); 
     f.setVisible(true); 

     component.addMouseListener(new TestMouseListener()); 
     } 

}

関連する問題