首页 文章

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

提问于
浏览
1

目前我为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直接与显示帧缓冲区和输入设备一起工作 . 因此,启动JavaFX时不应该运行X11桌面 .

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

2 回答

  • 0

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

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

    我能够通过反编译jfxrt.jar并更改类com.sun.glass.ui.monocle.DispmanCursor中的一行来解决问题 . 我用BytecodeViewer反编译它,将 setVisibility 方法更改为始终设置 false 值并保存为jar . (是的,更合适的方法是从源代码构建openjfx,但是's way faster this way for such a small change) If anyone knows a way to get an instance of DispmanCursor from code to use the method (although it' s包本地,所以我怀疑是否有办法) - 让我知道 .
    decompiled DispmanCursor
    我添加的另一个修复是更改com.sun.glass.ui.monocle.AcceleratedScreen - 它具有自那时以来已更改的硬编码库名称:libGLESv2.so和libEGL.so现在称为libbrcmGLESv2.so和libbrcmEGL.so分别参见this thread获取更多信息 .

    这是最后的fixed jfxrt.jar .

相关问题