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

时间:2017-01-22 18:04:10

标签: java linux javafx raspberry-pi raspbian

目前我为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属性最初起作用。但是在触摸屏幕或移动鼠标后,屏幕上会出现默认的鼠标光标。这似乎是一个尚未解决的问题:Post on raspberrypi.org forum

OpenJFX Wiki说:

  

请注意,Raspberry Pi上的JavaFX的默认配置可以   不要使用X11。相反,JavaFX直接与显示器配合使用   帧缓冲和输入设备。所以你不应该有X11桌面   在启动JavaFX时运行。

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

2 个答案:

答案 0 :(得分:1)

我找到了这个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);
                    });
            });
    }

答案 1 :(得分:0)

对于那些在搜索时偶然发现此问题的人:

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

这是最后的fixed jfxrt.jar。