gpt4 book ai didi

java - 触摸输入和 OpenJDK 11 与 JavaFX 11 的问题

转载 作者:行者123 更新时间:2023-12-01 09:40:35 24 4
gpt4 key购买 nike

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

JavaFX UI 应该在支持触摸的设备上运行,该设备过去直接与 Oracle JDK 1.8 配合使用。当我触摸屏幕时,会按预期触发以下鼠标事件序列:
MOUSE_PRESSEDMOUSE_RELEASEDMOUSE_CLICKED
使用 OpenJDK11 构建相同的应用程序后(使用 OpenJFX 11 作为外部库,因为默认情况下 JavaFX 不再是 JDK 的一部分)我得到以下事件序列:
MOUSE_ENTERED_TARGETMOUSE_ENTERED_TARGETMOUSE_EXITED_TARGETMOUSE_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 报告两种不同的状态,所以也许另一个触摸屏上的两种事件类型的状态字段相同是否与此有关?

    最佳答案

    我的触摸屏和 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 发行版。

    关于java - 触摸输入和 OpenJDK 11 与 JavaFX 11 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53852043/

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