我想知道是否可以使用事件监听器而不是鼠标监听器来检查JButton是否被双击。请考虑以下代码;
public void actionPerformed(ActionEvent arg0){
if (arg0.getClickCount() == 2){
System.out.println("You Doubled clicked");
}
}
我收到错误getClickCount() is undefined for the type ActionEvent
。点击或双击鼠标是否也被视为事件?思考。
答案 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
。它允许您不要使用不必要的方法(mouseDragged
,mouseEntered
等)来混淆您的代码。
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");
}
}
}
}