【问题标题】:Event listeners and Mouse listeners事件监听器和鼠标监听器
【发布时间】:2014-02-21 20:32:27
【问题描述】:

我想知道是否可以使用事件侦听器而不是鼠标侦听器来检查 JButton 是否被双击。考虑以下代码;

public void actionPerformed(ActionEvent arg0){
    if (arg0.getClickCount() == 2){
        System.out.println("You Doubled clicked");
    }
}

我收到一条错误消息,提示 getClickCount() is undefined for the type ActionEvent。鼠标的单击或双击是否也被视为事件?想法。

【问题讨论】:

    标签: java swing awt actionlistener mouse-listeners


    【解决方案1】:

    你不能。如果您不确定,请阅读文档。方法 OnClickCount 在 Action Event 类中不存在,它仅在 MouseEvent 类中可用。如果需要,请编写自己的方法。

    请参阅以下文档以供参考

    http://docs.oracle.com/javase/7/docs/api/java/awt/event/ActionEvent.html

    http://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseEvent.html

    【讨论】:

    • 关于如何创建自己的方法来检查 JButton 是连续单击还是双击的任何建议?抱歉,如果这是一个幼稚的问题。我对 java 还是很陌生。
    • 为什么要重新发明轮子?使用这个方法 btn.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { if (evt.getClickCount() == 2) { //做你想做的这里 } } });
    【解决方案2】:

    您想使用MouseAdapter。它允许您不要使用不必要的方法(mouseDraggedmouseEntered 等)使代码混乱。

    public class MyClass extends MouseAdapter {
        @Override
        public void mouseClicked(MouseEvent e) {
            if (e.getClickCount() == 2) {
                // Double click
            } else {
               // Simple click
            }
        }     
    }
    

    或者,如果您的类已经扩展了另一个类,请尝试以下代码:

    public class MyClass extends MyBaseClass {
        private MouseAdapter ma;
    
        public MyClass () {
            final MyClass that = this;
            ma = new MouseAdapter() {
    
                @Override
                public void mouseClicked(MouseEvent e) {
                    that.myMouseClickedHandler(e);
                }
            };
        }
    
        public void myMouseClickedHandler(MouseEvent e) {
            if (e.getClickCount() == 2) {
                // Double click
            } else {
               // Simple click
            }        
        }
     }
    

    【讨论】:

    • 答案将取决于 OP 是否只想知道鼠标点击或想继续支持正常交互(例如 [enter] 或 [space])
    【解决方案3】:

    ActionEvent 没有“getClickCount()”方法。
    见文档:ActionEvent API Doc

    您可以在 actionPerformed 方法中定义一个变量“numClicks”:

    public void actionPerformed(ActionEvent e) {
         numClicks++;
    

    那么如果“numClicks”等于'2',则表示发生了鼠标双击,那么你可以将其设置为零,等等...

    【讨论】:

    • 虽然这种方法更好地满足了用户的需求,但它留下的问题是如何确定用户是否不只是点击一次,离开一段时间后再次点击
    【解决方案4】:

    答案取决于。你只想知道按钮是什么时候“点击”两次还是什么时候“按下”了两次?

    通常不建议将MouseListener 附加到按钮上,因为该按钮可以通过多种方式触发,包括以编程方式

    你需要做的,不仅是计算actionPerformed被调用的次数,还要知道点击之间的时间。

    您可以记录最后一次点击时间并将其与当前时间进行比较并以此方式进行确定,或者您可以简单地使用 javax.swing.Timer 来为您完成。

    以下示例还检查ActionEvent 的最后一个源是否与当前源相同,如果不是则重置计数器...

    这也允许鼠标点击、按键和程序触发...

    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import java.awt.GridBagLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.Timer;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    public class TimerButton {
    
         public static void main(String[] args) {
            new TimerButton();
        }
    
        public TimerButton() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException ex) {
                    } catch (InstantiationException ex) {
                    } catch (IllegalAccessException ex) {
                    } catch (UnsupportedLookAndFeelException ex) {
                    }
    
                    JButton btn = new JButton("Testing");
                    btn.addActionListener(new ActionHandler());
    
                    JFrame frame = new JFrame("Test");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new GridBagLayout());
                    frame.add(btn);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class ActionHandler implements ActionListener {
    
            private Timer timer;
            private int count;
            private ActionEvent lastEvent;
    
            public ActionHandler() {
                timer = new Timer(250, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        System.out.println("Tick " + count);
                        if (count == 2) {
                            doubleActionPerformed();
                        }
                        count = 0;
                    }
                });
                timer.setRepeats(false);
            }
    
            @Override
            public void actionPerformed(ActionEvent e) {
                if (lastEvent != null && lastEvent.getSource() != e.getSource()) {
                    System.out.println("Reset");
                    count = 0;
                }
                lastEvent = e;
                ((JButton)e.getSource()).setText("Testing");
                count++;
                System.out.println(count);
                timer.restart();
            }
    
            protected void doubleActionPerformed() {
                Object source = lastEvent.getSource();
                if (source instanceof JButton) {
                    ((JButton)source).setText("Double tapped");
                }
            }
    
    
        }
    
    }
    

    【讨论】:

    • 我想知道按钮是否被按下了两次。
    • 是的,这会告诉你它是否被“按下”了两次,无论是通过鼠标、键盘还是编程方式
    猜你喜欢
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 2013-07-20
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多