![](/img/trans.png)
[英]noClassDefFoundException in javafx application in raspberry pi
[英]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 論壇上發帖
請注意,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 實例以使用該方法的方法(盡管它是本地包,所以我懷疑有沒有辦法) - 讓我知道。 我添加的另一個修復是更改 com.sun.glass.ui.monocle.AcceleratedScreen -- 它具有從那時起已更改的硬編碼庫名稱:libGLESv2.so 和 libEGL.so 現在分別稱為 libbrcmGLESv2.so 和 libbrcmEGL.so (有關更多信息,請參閱此線程)。
這是最終修復的jfxrt.jar。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.