Raspberry Pi无法在JavaFX应用程序中隐藏鼠标光标

目前我为Raspberry Pi 3开发了一个JavaFX应用程序。为了在我的PC上进行开发,我使用Ubuntu 16.04.1,OpenJDK 1.8.0_111和OpenJFX 8.0.60。 对于Raspberri Pi上的操作,我使用Raspbian Jessie和PIXEL(在控制台模式下启动),OpenJDK 1.8.0_40和OpenJFX 8.0.60。

不需要图形鼠标光标,因为用户只应使用触摸屏与应用程序进行交互。 此外,鼠标光标很烦人,因为它略微覆盖了屏幕的内容。 此外,每当触摸屏幕时,它通过改变其位置来刺激用户。 因此我想隐藏屏幕上的鼠标光标。

在我的电脑上,我可以使用以下代码隐藏鼠标光标:

scene.setCursor(Cursor.NONE); 

我使用bash shell在Raspberry Pi上启动应用程序

 java -jar MyApp.jar 

执行此操作后,setCurser属性最初起作用。 但是在触摸屏幕或移动鼠标后,屏幕上会出现默认的鼠标光标。 这似乎是一个尚未解决的问题: 在raspberrypi.org论坛上发帖

OpenJFX Wiki说:

请注意,Raspberry Pi上的JavaFX的默认配置不使用X11。 相反,JavaFX直接与显示帧缓冲区和输入设备一起工作。 因此,启动JavaFX时不应该运行X11桌面。

作为一种解决方法,如何在Raspbian Jessie的framebuffer中隐藏图形鼠标光标?

我找到了这个bug的解决方法。 虽然它在我的应用程序开始时会产生一些闪烁,但在我的情况下是可以接受的。 (也可以尝试在程序启动时关闭背光)这是魔术代码(发现固化效果意外地与几个全屏窗口一起工作)

 private void fixMouse(Stage primaryStage) { Platform.runLater(()->{ //Show mouse cursor Robot robot = com.sun.glass.ui.Application.GetApplication().createRobot(); robot.mouseMove(790,470); robot.destroy(); //Show fullscreen dialog final Stage dialog = new Stage(); dialog.initModality(Modality.APPLICATION_MODAL); dialog.initOwner(primaryStage); StackPane dialogLayout = new StackPane(); dialog.setFullScreen(true); dialog.setResizable(false); dialog.setFullScreenExitKeyCombination(KeyCombination.NO_MATCH); Scene dialogScene = new Scene(dialogLayout, 0, 0); dialogScene.setCursor(Cursor.NONE); dialogScene.setFill(Color.BLACK); dialogLayout.setBackground(Background.EMPTY); dialog.setScene(dialogScene); dialog.show(); // Auto close the dialog Platform.runLater(()->{ dialog.close(); primaryStage.setFullScreen(true); }); }); } 

对于在搜索时偶然发现这个问题的人:

我能够通过反编译jfxrt.jar并更改类com.sun.glass.ui.monocle.DispmanCursor中的一行来解决问题。 我用BytecodeViewer反编译它,将setVisibility方法更改为始终设置false值并保存为jar。 (是的,更合适的方法是从源代码构建openjfx,但这种方式对于这么小的变化更快)如果有人知道从代码中获取DispmanCursor实例的方法来使用该方法(虽然它是本地包,所以我怀疑是否有办法) – 让我知道。 反编译的DispmanCursor 我添加的另一个修复是更改com.sun.glass.ui.monocle.AcceleratedScreen – 它具有自那时以来已更改的硬编码库名称:libGLESv2.so和libEGL.so现在分别称为libbrcmGLESv2.so和libbrcmEGL.so (有关更多信息,请参阅此主题)。

这是最后修复的 jfxrt.jar。