java单击双击_Java-Javafx 2单击并双击CLI

这篇博客讨论了如何在JavaFX 2中检测单击和双击事件。通过示例代码展示了如何设置事件处理器以区分不同类型的点击,并提供了多种实现方法,包括使用ScheduledThreadPoolExecutor来区分单击和双击。
摘要由CSDN通过智能技术生成

Java-Javafx 2单击并双击CLI

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

我想在单击和双击之间创建不同的事件。

谢谢

7个解决方案

88 votes

是的,您可以检测到单击,双击甚至多次单击:

myNode.setOnMouseClicked(new EventHandler() {

@Override

public void handle(MouseEvent mouseEvent) {

if(mouseEvent.getButton().equals(MouseButton.PRIMARY)){

if(mouseEvent.getClickCount() == 2){

System.out.println("Double clicked");

}

}

}

});

MouseButton.PRIMARY用于确定是否触发了鼠标左键(通常)。 阅读getClickCount()的api得出的结论是,除单次或两次点击外,可能还有多次点击计数。 但是,我发现很难区分单击事件和双击事件。 因为双击的首次点击计数也会触发一个事件。

Uluk Biy answered 2020-01-11T13:20:51Z

7 votes

这是另一段代码,如果您必须区分单击和双击,并且在两种情况下都必须采取特定的操作,则可以使用该代码。

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() {

@Override

public void handle(MouseEvent e) {

if (e.getButton().equals(MouseButton.PRIMARY)) {

dragFlag = true;

}

}

});

root.setOnMouseClicked(new EventHandler() {

@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.");

}

}

mipa answered 2020-01-11T13:21:12Z

3 votes

P. Pandey的回答是最简单的方法,它实际上区分了单击和双击,但是它对我不起作用。 例如,函数“ 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...

}

parityerror answered 2020-01-11T13:21:32Z

2 votes

这是我实现双击的方式

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);

}

P. Pandey answered 2020-01-11T13:21:56Z

1 votes

遵循Java SE 8 lambda表达式将如下所示:

node.setOnMouseClicked(event -> {

if(event.getButton().equals(MouseButton.PRIMARY) && event.getClickCount() == 2) {

handleSomeAction();

}

});

一旦您习惯了lambda表达式-它们最终比原始的类实例化和重写(x)方法更容易理解。 -在我看来-

Joseph Malachosky answered 2020-01-11T13:22:20Z

1 votes

由于默认情况下无法区分单击和双击,因此我们使用以下方法:

单击时,我们将单击操作包装在可终止的可运行库中。 该可运行程序在执行之前会等待一定的时间(即TODO)。

同时,如果发生第二次点击,即双击,则单次点击操作被中止并且仅执行双击操作。

这样,无论是单击操作还是双击操作,都不会执行。

以下是完整的代码。 要使用它,只需将3条TODO行替换为所需的处理程序即可。

private static final int SINGLE_CLICK_DELAY = 250;

private ClickRunner latestClickRunner = null;

private class ClickRunner implements Runnable {

private final Runnable onSingleClick;

private boolean aborted = false;

public ClickRunner(Runnable onSingleClick) {

this.onSingleClick = onSingleClick;

}

public void abort() {

this.aborted = true;

}

@Override

public void run() {

try {

Thread.sleep(SINGLE_CLICK_DELAY);

} catch (InterruptedException e) {

e.printStackTrace();

}

if (!aborted) {

System.out.println("Execute Single Click");

Platform.runLater(() -> onSingleClick.run());

}

}

}

private void init() {

container.setOnMouseClicked(me -> {

switch (me.getButton()) {

case PRIMARY:

if (me.getClickCount() == 1) {

System.out.println("Single Click");

latestClickRunner = new ClickRunner(() -> {

// TODO: Single-left-click operation

});

CompletableFuture.runAsync(latestClickRunner);

}

if (me.getClickCount() == 2) {

System.out.println("Double Click");

if (latestClickRunner != null) {

System.out.println("-> Abort Single Click");

latestClickRunner.abort();

}

// TODO: Double-left-click operation

}

break;

case SECONDARY:

// TODO: Right-click operation

break;

default:

break;

}

});

}

Markus Weninger answered 2020-01-11T13:22:59Z

0 votes

使用PauseTransition的解决方案:

PauseTransition singlePressPause = new PauseTransition(Duration.millis(500));

singlePressPause.setOnFinished(e -> {

// single press

});

node.setOnMousePressed(e -> {

if (e.isPrimaryButtonDown() && e.getClickCount() == 1) {

singlePressPause.play();

}

if (e.isPrimaryButtonDown() && e.getClickCount() == 2) {

singlePressPause.stop();

// double press

}

});

bezvaapp answered 2020-01-11T13:23:19Z

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值