触摸输入和带有JavaFX 11的OpenJDK 11的问题

时间:2018-12-19 13:15:18

标签: java javafx touch openjfx

我正在研究JavaFX项目,并希望从Oracle JDK 1.8切换到OpenJDK11。到目前为止,过渡是无缝的,但是仍然存在与触摸/鼠标输入有关的一个主要问题,这会引起一些麻烦。 。

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

MOUSE_PRESSED

MOUSE_RELEASED

MOUSE_CLICKED

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

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通用
  • Oracle JDK 1.8.0_191
  • OpenJDK 11.0.1
  • 触摸屏(由xinput报告):Atmel maXTouch Digitizer
  • 触摸屏可以与其他应用程序很好地工作,单击事件似乎已按预期处理。
  • 与虚拟机有关的某些参数

    -Dcom.sun.javafx.isEmbedded=true

    -Dcom.sun.javafx.touch=true

    似乎都对这个问题没有影响

  • 根据我使用的是鼠标还是触摸屏,我得到的xev输出似乎略有不同:

    鼠标(对于ButtonPress,state0x0,对于ButtonRelease是0x100

    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的两个不同状态,因此也许另一触摸屏上两个事件类型的状态字段都相同?

2 个答案:

答案 0 :(得分:1)

我的触摸屏和JFX遇到相同的问题。我的代码可以在Open JDK 1.8及其对应的JFX上正常运行,而在OpenJDK 11及其对应的JFX上则无法运行。它可以与Liberica https://bell-sw.com/pages/java-11.0.7-for-Embedded/的JDK和JFX正常工作

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

答案 1 :(得分:0)

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