JavaFX:对单击、双击和三次单击的反应

2024-01-05

我正在尝试配置某些操作来响应鼠标单击次数。在我看来,单击和三次单击被检测到并应用。但双击实际上不起作用。 我尝试做类似的事情:

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

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


假设你正在做类似的事情

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaFX:对单击、双击和三次单击的反应 的相关文章

随机推荐

  • 将函数添加到枚举

    是否可以在 TypeScript 中向 Enum 类型添加函数 例如 enum Mode landscape portrait the dream toString console log this Or class ModeExtensi
  • Lambda 表达式用于访问一个对象的属性,该属性是 C# 中另一个对象的属性

    我有这两门课 public class Contratos public int EntidadeFinanceiraId get set Column Nome public EntidadesFinanceiras entidadeFi
  • ITL(iTunes 库)格式

    我正在开发一个用于管理 iTunes 库 ITL 文件 的 Java 解决方案 ITL 格式是一种专有格式 我正在寻找有关 ITL 格式的实现或文档 但 Google 找不到任何有用的东西 有人有这方面的经验吗 在哪里可以找到更多信息 提前
  • jquery 有等价的 dojo.hitch() 吗?

    原谅我的无知 因为我对 jquery 不太熟悉 有没有相当于道场 hitch http dojotoolkit org reference guide 1 7 dojo hitch html 它返回一个保证在给定范围内执行的函数 编辑 根据
  • ReactJS:如何从另一个组件更新组件

    我正在尝试写一个简单的textarea字符计数器小部件ReactJS http facebook github io react 学习如何使用它 但我现在知道如何通过火来设定价值textarea onChange event 这就是我编写应
  • jQuery 获取选择选项的名称

    我有一个包含多个选项的下拉列表 每个选项都有一个名称属性 当我选择一个选项时 需要出现不同的复选框列表 当选择另一个选项时 该复选框列表应该消失并显示另一个复选框 我创建了这些复选框列表 并为它们提供了一个与所选选项的名称属性相关的 ID
  • 获取“[object HTMLDivElement]”而不是其内容?

    我只想创建原始副本divs 位于一个带有一个案例的新 div 中 Case 1 复制那些具有favouriteid 的新 div 内的类fav items 我已经尝试过 我都尝试过innerHTML and appendChild 方法 当
  • 如何将多个jar添加到groovyConole/groovysh的类路径中?

    我不得不问这个问题 这感觉很荒谬 但我似乎无法将多个 jar 文件添加到 groovyConsole 和 groovysh 的类路径中 如何将多个 jar 文件添加到类路径 这是我尝试过的 groovyConsole cp lib comp
  • Sequelize - 如何仅返回数据库结果的 JSON 对象?

    所以我想要返回数据库结果而不是其他 目前我正在返回一大块 JSON 数据 如下所示 但我只需要 dataValues 属性 我不想使用这一点JSON检索它 tagData 0 dataValues tagId 我刚刚注意到 当它发现并且不创
  • Scala中有SoftHashMap吗?

    我知道这个问题是针对java的 https stackoverflow com questions 264582 is there a softhashmap in java 但这些实现似乎都不能很好地配合scala collection
  • 主循环旁边的多处理

    我现在正在为一个问题苦苦挣扎一段时间 我正在构建一个使用主循环的小脚本 这是一个需要用户注意的过程 用户对步骤做出响应 然后使用某些功能会发生一些神奇的事情 除此之外 我想生成另一个进程来监视计算机系统的某些特定事件 例如按特定键 如果发生
  • 使用C#设置HTML输入文本框的显示文本

    我的 ASPX 页面中有一个 HTML 输入框 如下所示
  • 类似于 .NET 中的可等待计时器

    在非托管 Win32 世界中 我习惯于用创建等待定时器 http msdn microsoft com en us library windows desktop ms682492 28v vs 85 29 aspx可用于同步调用的 API
  • 为什么带有毫秒参数的clearTimeout不起作用?

    我正在构建一个简单的横幅旋转器 事实是 当它在没有按下任何按钮的情况下旋转时 工作正常 但是当我按下某个按钮来更改横幅并清除时间时 它不起作用 看来时间不太清楚 var tempo 5000 var elemento var quantos
  • 使用 LINQ to SQL 时这是一个虚假警告吗?

    根据我见过的许多 LINQ 示例 我正在使用类似于以下代码的代码创建自己的数据上下文和表 class MyDatabase DataContext public Table
  • 将 IIS 应用程序池回收事件记录在 Windows 事件日志中

    我想得到IIS 7应用程序池回收 启动 停止等事件要记录到Windows事件日志 我按照中概述的步骤操作本文 http www iisadmin co uk p 17但没有取得任何成功 我重新启动了应用程序池 事件日志中没有记录任何内容 我
  • CloudWatch 自定义指标未按预期工作

    我已经根据发送到 CloudWatch 的一些日志文件创建了 7 个其他指标 没有出现任何问题 前段时间我们遇到了 MongoDB 连接问题 我通过日志发现了这个问题 所以我想创建一个 Metric 以便我可以基于它创建一个 Alarm 我
  • 带有 Plastic SCM 的超大型存储库

    我们正在研究 Plastic SCM 作为 Subversion 的可能替代方案 用于我们产品的版本控制 除了非常庞大的源代码库之外 我们还拥有大量的二进制资产 主要是艺术资产 还包括一些文档 AVI 等 简单说一下 svn 检查我们的 t
  • 变长系列

    我试图确定是否可以在 Excel 中编写以下计算 其中 n 是变量并且来自用户输入 n的值是正数并且等于或大于1 是否可以写一个公式而不是使用vba 2 1 2 2 2 3 2 n If n 1 then the calculation w
  • JavaFX:对单击、双击和三次单击的反应

    我正在尝试配置某些操作来响应鼠标单击次数 在我看来 单击和三次单击被检测到并应用 但双击实际上不起作用 我尝试做类似的事情 if doubleClick else if tripleClick else if singleClick 检查顺