【问题标题】:Raspberry Pi can't hide mouse cursor in JavaFX applicationRaspberry Pi 无法在 JavaFX 应用程序中隐藏鼠标光标
【发布时间】:2017-06-07 06:06:12
【问题描述】:

目前我为 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 的帧缓冲区中隐藏图形鼠标光标?

【问题讨论】:

    标签: java linux javafx raspberry-pi raspbian


    【解决方案1】:

    我找到了解决此错误的方法。虽然它在我的应用程序开始时会产生一些闪烁,但在我的情况下是可以接受的。 (您也可以尝试在程序启动期间关闭背光) 这是神奇的代码(治愈效果是在几个全屏窗口中意外发现的)

    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);
                        });
                });
        }
    

    【讨论】:

      【解决方案2】:

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

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

      这是最终的fixedjfxrt.jar。

      【讨论】:

        猜你喜欢
        • 2021-05-01
        • 2018-06-04
        • 1970-01-01
        • 1970-01-01
        • 2017-04-05
        • 2013-09-16
        • 2011-05-24
        • 1970-01-01
        • 2015-05-27
        相关资源
        最近更新 更多