gpt4 book ai didi

javafx-8 - JavaFX : Reacting to Single, 双击和三次单击

转载 作者:行者123 更新时间:2023-12-02 05:42:24 24 4
gpt4 key购买 nike

我正在尝试配置某些操作以响应鼠标点击次数。在我看来,单击和三次单击被检测并应用。但双击并没有真正起作用。
我试图做这样的事情:

if (doubleClick)
else if (tripleClick)
else if (singleClick).

检查的顺序也没有帮助,双击的 Action 永远不会被触发,因为首先触发了单击的 Action 。关于如何做到这一点的任何想法?

最佳答案

假设你正在做类似的事情

if (mouseEvent.getClickCount()==1) 

等等,那么它可能没有按照你的想法去做。 MouseEvent.getClickCount() 只返回在“小”区域和“小”时间内发生的点击次数。 “小”是(故意)没有定义的。

所以双击只是两次点击。第一个为 getClickCount() 返回 1 ,然后第二次返回 2。类似地,三次单击是三次单击:第一次返回 1,下一次返回 2,第三次返回 3。您可以使用一段非常简单的代码进行测试:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class ClickCountTest extends Application {

@Override
public void start(Stage primaryStage) {
Pane root = new Pane();
root.setOnMouseClicked(event -> System.out.println(event.getClickCount()));
primaryStage.setScene( new Scene(root, 250, 150) );
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}
}

如果单击,您将看到输出“1”。如果您双击,您会看到一个“1”后跟一个“2”。

如果是双击(或三次)单击的一部分,则没有内置方法可以忽略第一次单击。显然,问题在于,在第一次点击时,如果没有某种时间安排,就无法知道是否会再次点击,这会变得非常复杂,并且会导致对任何鼠标点击的响应延迟。

前段时间有一些关于实现 onClickSequenceFinished 的讨论。事件类型,这样您就可以监听单击序列完成事件而不是监听鼠标单击事件,然后查询该事件以查找点击次数。最后,决定不支持这一点,因为用例不被认为是良好的 UI 编程实践。

这样做的原因是,例如,双击以排除单击操作是一个非常糟糕的主意。如果用户的双击速度太慢,那么他们将无意中调用单击操作(两次)。因此,如果您同时支持双击和单击操作,则应选择这些操作,以便在调用双击操作时调用单击操作是有意义的。典型的例子是 ListView ,双击列表元素打开“详细信息”编辑器,单击选择项目。被编辑的项目也被选中是有意义的,所以双击 Action 意味着单击 Action 。

换句话说,如果双击操作旨在排除单击操作,并且不直接支持该习语,则被认为是一种糟糕的设计。对于这种区别,您应该考虑使用修饰键而不是点击次数。

更新:
如果你真的想通过这样的点击计数来区分事件(我 真的 不推荐它),那么你可以使用类似 PauseTransition 的东西来实现定时器。就像是:
import javafx.animation.PauseTransition;
import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import javafx.util.Duration;

public class ClickCountTest extends Application {

@Override
public void start(Stage primaryStage) {

// This value may need tuning:
Duration maxTimeBetweenSequentialClicks = Duration.millis(500);

PauseTransition clickTimer = new PauseTransition(maxTimeBetweenSequentialClicks);
final IntegerProperty sequentialClickCount = new SimpleIntegerProperty(0);
clickTimer.setOnFinished(event -> {
int count = sequentialClickCount.get();
if (count == 1) System.out.println("Single click");
if (count == 2) System.out.println("Double click");
if (count == 3) System.out.println("Triple click");
if (count > 3) System.out.println("Multiple click: "+count);
sequentialClickCount.set(0);
});

Pane root = new Pane();
root.setOnMouseClicked(event -> {
sequentialClickCount.set(sequentialClickCount.get()+1);
clickTimer.playFromStart();
});
primaryStage.setScene( new Scene(root, 250, 150) );
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}
}

这也可能是 Tomas Mikula's ReactFX framework 的一个很好的用例,(另见他的 blog post)。

关于javafx-8 - JavaFX : Reacting to Single, 双击和三次单击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23231209/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com