You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX 18.0.1+Windows11+JDK18.0.1.1:Canvas无法触发触摸屏事件

JavaFX触摸事件无法触发的解决方案

问题分析

你的代码逻辑本身没有误用JavaFX API,但JavaFX在Windows平台上默认可能未启用触摸事件支持,或是系统配置、驱动问题导致触摸事件无法被捕获。

解决步骤

1. 添加触摸支持的系统属性

在应用启动前设置强制启用触摸的系统属性,修改main方法:

public static void main(String[] args) {
    System.setProperty("prism.allowhidpi", "true");
    System.setProperty("glass.touch", "true");
    launch(args);
}

2. 调整事件注册节点

尝试将事件过滤器注册到Scene或Canvas上,避免Stage层级的事件传递问题:

// 注册到Scene
scene.addEventFilter(TouchEvent.ANY, e -> System.out.println("touch event: " + e));

// 或者注册到Canvas
canvas.addEventFilter(TouchEvent.ANY, e -> System.out.println("touch event: " + e));

3. 检查Windows系统触摸配置

  • 打开Windows设置,进入系统 > 触摸,确认触摸功能已启用,且无干扰性触摸手势设置。
  • 更新触摸屏幕的驱动程序,过时驱动可能导致事件无法被JavaFX识别。

4. 升级JavaFX版本

尝试升级到JavaFX 19及以上版本,后续版本对Windows触摸支持有针对性优化,可解决部分兼容性问题。

修改后的完整代码示例

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.input.TouchEvent;
import javafx.stage.Stage;

public class JavaFXSandbox extends Application {

    public static void main(String[] args) {
        System.setProperty("prism.allowhidpi", "true");
        System.setProperty("glass.touch", "true");
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        Group root = new Group();
        Scene scene = new Scene(root, 600, 600);

        Canvas canvas = new Canvas(600, 600);
        root.getChildren().add(canvas);

        scene.addEventFilter(TouchEvent.ANY, e -> System.out.println("touch event: " + e));

        stage.setScene(scene);
        stage.show();
    }
}

内容的提问来源于stack exchange,提问作者coderodde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 10:33:19