Javafx 2单击并双击

我想知道是否有可能检测到JavaFX 2中的双击? 如何 ?

我想在点击和双击之间做出不同的事件。

谢谢

是的,您可以检测单个,双击甚至多个点击:

myNode.setOnMouseClicked(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent mouseEvent) { if(mouseEvent.getButton().equals(MouseButton.PRIMARY)){ if(mouseEvent.getClickCount() == 2){ System.out.println("Double clicked"); } } } }); 

MouseButton.PRIMARY用于确定左(通常)鼠标button是否触发事件。 阅读getClickCount()的api得出的结论是可能有多个单击或双击以外的点击数。 不过,我发现很难区分单击事件和双击事件。 因为双击的第一次点击次数也会增加一个事件。

如果你想要处理一个点击和双击添加,不起作用

 if(mouseEvent.getClickCount() == 2) { System.out.println("Doubleclicked"); } else if(mouseEvent.getClickCount() == 1) { System.out.println("Single clicked"); } 

结果是: "Single clicked"总是被触发。

这里是另一段代码,如果你必须区分单击和双击,并且在任何情况下都必须采取特定的行动,那么可以使用这段代码。

 import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import javafx.application.Application; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.input.MouseButton; import javafx.scene.input.MouseEvent; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class DoubleClickDetectionTest extends Application { boolean dragFlag = false; int clickCounter = 0; ScheduledThreadPoolExecutor executor; ScheduledFuture<?> scheduledFuture; public DoubleClickDetectionTest() { executor = new ScheduledThreadPoolExecutor(1); executor.setRemoveOnCancelPolicy(true); } public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { StackPane root = new StackPane(); primaryStage.setScene(new Scene(root, 400, 400)); primaryStage.show(); root.setOnMouseDragged(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent e) { if (e.getButton().equals(MouseButton.PRIMARY)) { dragFlag = true; } } }); root.setOnMouseClicked(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent e) { if (e.getButton().equals(MouseButton.PRIMARY)) { if (!dragFlag) { System.out.println(++clickCounter + " " + e.getClickCount()); if (e.getClickCount() == 1) { scheduledFuture = executor.schedule(() -> singleClickAction(), 500, TimeUnit.MILLISECONDS); } else if (e.getClickCount() > 1) { if (scheduledFuture != null && !scheduledFuture.isCancelled() && !scheduledFuture.isDone()) { scheduledFuture.cancel(false); doubleClickAction(); } } } dragFlag = false; } } }); } @Override public void stop() { executor.shutdown(); } private void singleClickAction() { System.out.println("Single-click action executed."); } private void doubleClickAction() { System.out.println("Double-click action executed."); } } 

P.Pendey的回应是实际区分单击和双击的最简单的方法,但它对我没有任何作用。 首先,函数“currentTimeMillis”已经返回毫秒,因此除以1000似乎是不必要的。 下面的版本以更一致的方式为我工作。

  @Override public void handle(MouseEvent t) { long diff = 0; currentTime=System.currentTimeMillis(); if(lastTime!=0 && currentTime!=0){ diff=currentTime-lastTime; if( diff<=215) isdblClicked=true; else isdblClicked=false; } lastTime=currentTime; System.out.println("IsDblClicked()"+isdblClicked); //use the isdblClicked flag... } 

这是我如何实现双击

 if (e.getEventType().equals(MouseEvent.MOUSE_CLICKED) && !drag_Flag) { long diff = 0; if(time1==0) time1=System.currentTimeMillis(); else time2=System.currentTimeMillis(); if(time1!=0 && time2!=0) diff=time2-time1; if((diff/1000)<=215 && diff>0) { isdblClicked=true; } else { isdblClicked=false; } System.out.println("IsDblClicked()"+isdblClicked); 

}