为什么我的JavaFx应用程序在我的RaspberryPi上运行时没有框架?

Jus*_*man 3 javafx raspberry-pi raspbian

我在我的Raspberry Pi上安装了JDK 8,并尝试运行javaFx示例应用程序.我的操作系统是Raspbian.我正在使用Netbeans 8附带的"DigitalClock"示例应用程序.该应用程序在Pi上启动并运行,但是当它执行时几乎全屏并且在主视图周围有这么大的黑色边框.此外,应用程序上没有框架.没有退出或最小化按钮.坦率地说,我不知道如何关闭应用程序或只是在较小的窗口中运行它.要恢复使用我的Pi,我必须拔掉它并重新启动.

我在这做错了什么?

jew*_*sea 7

JavaFX开发人员Daniel Blaukopf在Raspberry Pi论坛中对此进行了解释:

Raspberry Pi上的JavaFX使用帧缓冲,而不是X11桌面.它占据了整个屏幕.查看Raspberry Pi上的open-jfx wiki页面.

Raspberry Pi上具有加速图形的JavaFX仅处于全屏模式.可以在窗口中进行非加速图形,但性能会非常糟糕.Pi上的EGL实现在X11窗口中不支持OpenGL,至少不是我检查的时间.

我也将在这里复制open-jfx wiki中的链接信息,以防wiki页面死掉:

Raspberry Pi上的JavaFX接管整个屏幕并捕获所有Linux输入设备.虽然这通常是您在部署的应用程序中所需的行为,但它不太便于开发,因为除非JavaFX应用程序具有KeyEvent侦听control-C和调用的处理程序,否则无法使用control-C停止应用程序Platform.exit().这没有什么不寻常之处 - 许多Linux全屏控制台应用程序具有相同的行为 - 但在开发过程中快速结束应用程序而不更改应用程序代码通常很有用.

有两种方法可以通过control-C终止应用程序:

  1. 通过SSH连接从PC运行应用程序.这可以最大程度地控制设备,因为一旦设置了SSH连接,您就可以将它们用于其他目的.

  2. 或者,您可以使用内置调试功能来捕获control-C.如果JAVAFX_DEBUG=1在启动Java之前设置环境变量,那么当您按control-C时,JavaFX将退出.例如:

JAVAFX_DEBUG=1
/opt/jdk1.8.0/bin/java -cp Stopwatch.jar stopwatch.MainScreen
Run Code Online (Sandbox Code Playgroud)

JAVAFX_DEBUG环境变量仅用于开发,您不应依赖它来部署应用程序.将来,此功能可能会以不同方式指定或删除.

添加个人问题的答案

是否有允许用户退出以全屏模式运行的JavaFX应用程序的"最佳实践"?我希望我的用户能够启动我的应用程序,使用它,然后关闭它.

您应该对应用程序进行编码,以包含一个相当明显的UI元素,以允许用户关闭应用程序.例如,通过在主应用程序屏幕上放置关闭按钮或提供关闭菜单选项:

Button close = new Button("Close");
close.setOnAction(
    new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            primaryStage.close();
            // or Platform.exit();
        }
    }
);
Run Code Online (Sandbox Code Playgroud)

如果您还希望应用程序响应并退出组合键,例如Ctrl+C,则还可以包含组合键加速器:

primaryStage.getScene().getAccelerators().put(
    KeyCombination.keyCombination("CTRL+C"),
    new Runnable() {
        @Override
        public void run() {
            Platform.exit();
        }
    }
);
Run Code Online (Sandbox Code Playgroud)