我正在开发一个 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
- 甲骨文 JDK 1.8.0_191
- OpenJDK 11.0.1
- 触摸屏(据报道
xinput
):Atmel maXTouch Digitizer - 触摸屏与其他应用程序配合得很好,点击事件似乎按预期处理。
somehwat 相关的 VM 参数
-Dcom.sun.javafx.isEmbedded=true
和-Dcom.sun.javafx.touch=true
两者似乎都对这个问题没有影响
xev
根据我是使用鼠标还是触摸屏,我得到 的输出似乎略有不同:鼠标(
state
用于0x0
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 报告两种不同的状态,所以也许另一个触摸屏上两种事件类型相同的状态字段毕竟与此有关?