【问题标题】:Problems with touch input and OpenJDK 11 with JavaFX 11触摸输入和带有 JavaFX 11 的 OpenJDK 11 的问题
【发布时间】:2019-05-19 23:50:27
【问题描述】:

我正在开发一个 JavaFX 项目,并希望从 Oracle JDK 1.8 切换到 OpenJDK 11。到目前为止,过渡非常顺利,但仍然存在一个与触摸/鼠标输入相关的主要问题,这会造成一些麻烦.

JavaFX UI 应该在支持触控的设备上运行,该设备过去可以直接与 Oracle JDK 1.8 一起使用。当我触摸屏幕时,会按预期触发以下鼠标事件序列:

MOUSE_PRESSED

MOUSE_RELEASED

MOUSE_CLICKED

在使用 OpenJDK11 构建相同的应用程序后(使用 OpenJFX 11 作为外部库,因为默认情况下 JavaFX 不再是 JDK 的一部分)我得到以下事件序列:

MOUSE_ENTERED_TARGET

MOUSE_ENTERED_TARGET

MOUSE_EXITED_TARGET

MOUSE_EXITED_TARGET

这解释了为什么我不能点击任何按钮(或一般的控件)。到目前为止,一切都很好。问题是,如何找回我的 MOUSE_{PRESSED,RELEASED,CLICKED} 事件?

SSCE:

package com.example.jfxtouchtest;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.TouchEvent;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;


public class JFXTouchTest {

    public static void main(String[] args) {
        Application.launch(JFXApp.class, args);
    }

    public static class JFXApp extends Application {
        @Override
        public void start(Stage primaryStage) {
            primaryStage.addEventFilter(TouchEvent.ANY, e -> System.out.println("touch event: " + e.getEventType()));
            primaryStage.addEventFilter(MouseEvent.ANY, e -> System.out.println("mouse event: " + e.getEventType()));
            primaryStage.setScene(new Scene(new Pane()));
            primaryStage.setWidth(800);
            primaryStage.setHeight(600);
            primaryStage.show();
        }
    }
}

我认为值得注意的是,无论我是否使用触摸屏,所有触发的事件都是MouseEvents(不是TouchEvents)。在我看来,这本身就有点奇怪,但至少我在 JDK 8 中得到了想要的行为......

一些背景资料:

  • 操作系统:Ubuntu 18.04.01 LTS
  • 内核:4.15.0-42-generic
  • Oracle JDK 1.8.0_191
  • OpenJDK 11.0.1
  • 触摸屏(由xinput 报告):Atmel maXTouch 数字化仪
  • 触摸屏与其他应用程序配合得很好,点击事件似乎按预期处理。
  • somehwat 相关的 VM 参数

    -Dcom.sun.javafx.isEmbedded=true

    -Dcom.sun.javafx.touch=true

    两者似乎都对问题没有影响

  • 我得到的xev 输出似乎略有不同,具体取决于我使用的是鼠标还是触摸屏:

    鼠标(state0x0 用于 ButtonPress,0x100 用于 ButtonRelease):

    ButtonPress event, serial 34, synthetic NO, window 0x3400001,
        root 0x193, subw 0x0, time 16982696, (93,90), root:(964,612),
        state 0x0, button 1, same_screen YES
    
    ButtonRelease event, serial 34, synthetic NO, window 0x3400001,
        root 0x193, subw 0x0, time 16983364, (93,90), root:(964,612),
        state 0x100, button 1, same_screen YES
    

    触摸屏(state 在这两种情况下都是 0x100):

    ButtonPress event, serial 34, synthetic NO, window 0x3400001,
        root 0x193, subw 0x0, time 17599475, (93,145), root:(964,667),
        state 0x100, button 1, same_screen YES
    
    ButtonRelease event, serial 34, synthetic NO, window 0x3400001,
        root 0x193, subw 0x0, time 17599537, (93,145), root:(964,667),
        state 0x100, button 1, same_screen YES
    

    不过,我不确定这意味着什么。

任何帮助都将不胜感激,即使只是确认问题可以在另一台具有其他类型触摸屏的机器上重现!非常感谢!

更新:与此同时,我设法将手放在了另一个触摸屏上,而且它似乎与那个触摸屏配合得很好。有趣的是,就像普通的鼠标事件一样,xev 报告了 ButtonPress 和 ButtonRelease 的两种不同状态,所以也许另一个触摸屏上两种事件类型的 state 字段相同与此有关吗?

【问题讨论】:

    标签: java javafx touch openjfx


    【解决方案1】:

    通过使用 java 参数 -Djdk.gtk.version=2 强制 JavaFX 使用 gtk-2。触摸屏可以使用该设置,尽管这会导致我们的应用程序出现其他问题(可能与第 3 方库有关)。

    【讨论】:

      【解决方案2】:

      我的触摸屏和 JFX 也有同样的问题。我的代码适用于 Open JDK 1.8 及其相应的 JFX,但适用于 OpenJDK 11 及其相应的 JFX。它适用于 Liberica 的 JDK 和 JFX https://bell-sw.com/pages/java-11.0.7-for-Embedded/

      所以对我来说,我的解决方法是更改​​为 Liberica JDK 11 和 JFX 发行版。 其他选项可能是来自 Azul 或 Corretto 的 JDK、JFX 发行版。

      【讨论】:

      猜你喜欢
      • 2019-04-06
      • 2019-03-03
      • 1970-01-01
      • 2019-03-24
      • 2019-02-27
      相关资源
      最近更新 更多