簡體   English   中英

Raspberry Pi 無法在 JavaFX 應用程序中隱藏鼠標光標

[英]Raspberry Pi can't hide mouse cursor in JavaFX application

目前,我正在為 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。

圖形鼠標光標是不必要的,因為用戶應該只使用觸摸屏與應用程序交互。 此外,鼠標光標很煩人,因為它稍微覆蓋了屏幕內容。 此外,每當觸摸屏幕時,它都會通過改變其位置來刺激用戶。 因此我想在屏幕上隱藏鼠標光標。

在我的 PC 上,我可以使用以下代碼隱藏鼠標光標:

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 的幀緩沖區中隱藏圖形鼠標光標?

我找到了解決此錯誤的方法。 雖然它在我的應用程序開始時會產生一些閃爍,但在我的情況下是可以接受的。 (也可以嘗試在程序啟動期間關閉背光)這是魔術代碼(治愈效果是在幾個全屏窗口意外工作時發現的)

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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM