2012-03-03 49 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/)(這將回答這個問題,以及我可能會問的其他問題中的4個)。 – 2012-03-03 19:33:28

+1

僞造事件通常是一個壞主意。爲什麼不將處理doubleclick的代碼移動到單獨的方法中並直接調用該方法? – 2012-03-03 21:29:37

+0

你爲什麼這樣做?是否用於測試? – DNA 2012-03-03 22:55:48

回答

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 
       )); 
      } 
     }); 
    }   
}); 

當我點擊fireEventButtonMouseEvent被正確地分派給clickTwiceButton,並如預期出現的對話框。

因此,正如@Andrew指出的那樣,問題似乎在於要麼將事件觸發到錯誤的組件上,要麼就是在註冊的代碼中發生了某些不正確的事情。

使用component.getMouseListeners()來檢查組件監聽器並調試處理其事件的代碼。

+1

使用「EventQueue」的+1; @ user1246353還應該考慮使用['Robot'](http://docs.oracle.com/javase/7/docs/api/java/awt/Robot.html)。 – trashgod 2012-03-03 23:58:28

+1

嗨@trashgod,很高興再次見到你。 1+爲機器人的建議。只有一件事(我懶得打開一個新問題,但我認爲這與OP問題有關),因爲事件直接從Listener派發,不會在'EventQueue'上運行嗎?我從不確定何時需要'invokeLater'和'invokeAndWait'。 – 2012-03-04 01:18:57

+1

好問題:不一定;我們沒有顯示OP的'Runnable'是如何引發的。只要'actionPerformed()'在EDT上運行,'invokeLater()'確保在'ActionListener'完成後''MouseEvent'將被分派。仔細一看,我發現我忽略了OP的類似用法,所以+1用於@ @ Override! – trashgod 2012-03-04 04:28:08

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()); 
     } 

}