JavaFx Button实现双击

    最近在写日历课设,需要多个按钮区别双击与单击,以响应不同的事件,发现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{
		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("双击");
		}
		
	}
}

你可能感兴趣的:(JavaFx)