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

}