事件侦听器和鼠标侦听器

时间:2014-01-29 19:54:35

标签: java swing awt actionlistener mouse-listeners

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

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

我收到错误getClickCount() is undefined for the type ActionEvent。点击或双击鼠标是否也被视为事件?思考。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您想使用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
        }        
    }
 }

答案 2 :(得分:0)

ActionEvent没有“getClickCount()”方法 请参阅文档:ActionEvent API Doc

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

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

然后如果“numClicks”等于'2',则双击鼠标,然后你可以将它设置回零等等......

答案 3 :(得分:0)

答案取决于。您是否只想知道按钮被“点击”两次或何时“按下”两次?

通常不鼓励将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");
            }
        }


    }

}