【问题标题】:Generate a double click mouse event in Java Swing在 Java Swing 中生成双击鼠标事件
【发布时间】:2012-03-21 21:20:59
【问题描述】:

我正在尝试在 EDT 上生成双击鼠标事件,如下所示:

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。

有什么建议或例子吗?

【问题讨论】:

  • 什么是component?事实上,不必费心回答这个问题。为了尽快获得更好的帮助,请发布SSCCE(它将回答这个问题,以及我可能会问的其他 5 个问题中的 4 个)。
  • 伪造事件通常是个坏主意。为什么不把处理双击的代码移到一个单独的方法中,直接调用那个方法呢?
  • 你为什么要这样做?是用来测试的吗?

标签: java swing mouseevent double-click


【解决方案1】:

考虑:

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

当我单击fireEventButton 时,MouseEvent 被正确分派到clickTwiceButton,并且对话框按预期显示。

因此,正如@Andrew 指出的那样,问题似乎是您将事件触发到错误的组件,或者注册的MouseListener / MouseAdapter 代码有问题。

使用component.getMouseListeners() 检查您的组件监听器并调试处理其事件的代码。

【讨论】:

  • +1 用于使用EventQueue; @user1246353 也应该考虑使用Robot
  • 嗨@trashgod,很高兴再次见到你。 1+ 用于机器人建议。只有一件事(我懒得打开一个新问题,但我认为这与 OP 问题有关),因为事件是直接从侦听器分派的,它不会在 EventQueue 上运行吗?我不确定什么时候真正需要invokeLaterinvokeAndWait
  • 好问题:不一定;我们没有看到 OP 的 Runnable 是如何被唤起的。只要actionPerformed() 在EDT 上运行,invokeLater() 就确保MouseEvent 将在ActionListener 完成后 被调度。仔细看,我发现我忽略了 OP 的类似用法,所以 +1 @Override
  • @Anthony Accioly 不错的回答 +1
【解决方案2】:

方法很简单。你应该得到第一次点击的时间和第二次点击的时间,然后你可以在两者之间做一个条件。 方法代码如下:

private boolean state=false;
private long first_pressed;
JButton btnAdd = new JButton("add");
btnAdd.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            
            if(state==false) {
                first_pressed=e.getWhen();
                state=true;
            }
            if(first_pressed!=e.getWhen())
            {
                JOptionPane.showConfirmDialog(null,"doubel click","Click",JOptionPane.YES_NO_OPTION);
                state=false;
            }
        }
 });

【讨论】:

    【解决方案3】:
       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());
          }
    

    }

    【讨论】:

      猜你喜欢
      • 2012-01-14
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 2019-02-09
      • 2023-04-04
      • 2022-01-12
      • 2012-03-30
      • 1970-01-01
      相关资源
      最近更新 更多