最近在写日历课设,需要多个按钮区别双击与单击,以响应不同的事件,发现Button没有现成的双击方法可使用,虽然有e.getClickCount(),但显然不满足我们的需求。后在网上看了以下博客点击打开链接,经测试,当界面至少有两个按钮注册了同一个MyMouseListener对象,则当你手速足够快,在ButtonA单击一下后,马上单击一下ButtonB,就会造成ButtonB双击的错误后果。
结合此博客的实现思路,“考虑当第一次单击鼠标的时候让鼠标单击事件延时delay秒执行,而在这段时间里等待第二次单击,如果有第二次单击,那么我们执行双击事件任务,取消单击任务;如果在这段时间没有等到再次单击,那么执行单击任务. ”,自己实现了JavaFx的Button单击 双击,具体代码如下。
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JButton;
import javafx.application.*;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
public class Test3 extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
Button bt1 = new Button("bt1");
Button bt2 = new Button("bt2");
bt1.setOnAction(new A());
bt1.setId("0");
bt2.setOnAction(new A());
bt2.setId("0");
Pane pane = new HBox();
pane.getChildren().addAll(bt1, bt2);
Scene scene = new Scene(pane, 300, 400);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch();
}
//主要代码
class A implements EventHandler<ActionEvent>{
private int delay = 300; // 设置延时为300ms
@Override
public void handle(ActionEvent event) {
// TODO Auto-generated method stub
Button bt = (Button)(event.getSource());
int count = Integer.parseInt(bt.getId())+1;
bt.setId(count + "");
//System.out.println(count);
if(count%2 == 1) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
if(Integer.parseInt(bt.getId()) == count) {
mouseSingleClicked(event);
bt.setId("0");
}
}
}, delay);
}else {
mouseDoubleClicked(event);
bt.setId("0");
}
}
public void mouseSingleClicked(ActionEvent e) {
System.out.println("单击");
}
public void mouseDoubleClicked(ActionEvent e) {
System.out.println("双击");
}
}
}