假设你正在做类似的事情
if (mouseEvent.getClickCount()==1)
等等,那么它可能没有按照你的想法去做。MouseEvent.getClickCount() http://docs.oracle.com/javase/8/javafx/api/javafx/scene/input/MouseEvent.html#getClickCount--仅返回“小”区域和“小”时间内发生的点击次数。 “小”是(故意)没有定义的。
所以双击只是两次点击。第一个返回 1getClickCount()
,然后第二次返回 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
,其中双击列表元素会打开“详细信息”编辑器,然后单击会选择该项目。正在编辑的项目也被选中是有意义的,因此双击操作意味着单击操作。
换句话说,如果双击操作被设计为排除单击操作,并且不直接支持该习惯用法,则被认为是糟糕的设计。您应该考虑使用修饰键而不是单击计数来进行这种区分。
Update:
If you really想要通过像这样的点击计数来区分事件(并且我really不推荐它),那么你可以使用类似的东西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 的 ReactFX 框架 http://www.reactfx.org/,(另见他的博客文章 http://tomasmikula.github.io/blog/2014/03/22/trigger-processing-after-a-period-of-inactivity.html).