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

为什么JavaFx应用程序在RaspberryPi上运行时没有框架?,javafx,raspberry-pi,raspbian,Javafx,Raspberry Pi,Raspbian,我在Raspberry Pi上安装了JDK 8,并尝试运行javaFx示例应用程序。我的操作系统是Raspbian。我正在使用Netbeans 8附带的“DigitalClock”示例应用程序。应用程序在Pi上启动和运行,但当它启动时,它几乎是全屏的,并且在主视图周围有一个大的黑色边框。此外,应用程序上没有框架。没有退出或最小化按钮。坦白地说,我不知道如何关闭应用程序或只是在较小的窗口中运行它。要继续使用我的Pi,我必须拔掉它并重新启动 我做错了什么?JavaFX开发人员Daniel Blauk

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


我做错了什么?

JavaFX开发人员Daniel Blaukopf在一篇文章中解释了这一点:

Raspberry Pi上的JavaFX使用帧缓冲区,而不是X11桌面。它占据了整个屏幕。看

Raspberry Pi上带有加速图形的JavaFX仅处于全屏模式。在窗口中进行非加速图形是可能的,但其性能相当差。Pi上的EGL实现不支持X11窗口中的OpenGL,至少在我检查的时候是这样

我还将从打开的jfx wiki复制链接信息,以防wiki页面死掉:

Raspberry Pi上的JavaFX接管整个屏幕并捕获所有Linux输入设备。虽然这通常是您希望在已部署应用程序中实现的行为,但开发起来不太方便,因为您无法停止使用control-C的应用程序,除非JavaFX应用程序具有侦听control-C并调用
Platform.exit()
KeyEvent
处理程序。这并没有什么不寻常的地方——许多Linux全屏控制台应用程序都有相同的行为——但在开发过程中,在不更改应用程序代码的情况下,有一种快速结束应用程序的方法通常很有用

有两种方法可以运行能够被control-C终止的应用程序:

  • 从PC上通过SSH连接运行应用程序。这将提供对设备的大部分控制,因为一旦设置了SSH连接,您也可以将其用于其他目的

  • 或者,您可以使用内置调试功能捕获control-C。如果在启动Java之前设置环境变量
    JAVAFX_DEBUG=1
    ,则按下control-C时,JAVAFX将退出。例如:

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

    谢谢是否有允许用户退出全屏运行的JavaFx应用程序的“最佳实践”?我希望我的用户能够启动我的应用程序,使用它,然后关闭它。@贾斯汀威斯曼:或者,考虑<代码>快捷方式+C“<代码> >,在另一个平台上建议和说明。请注意,MacOS会自动处理
    “快捷方式+Q”
    ;您的平台可能会有所不同。
    Button close = new Button("Close");
    close.setOnAction(
        new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                primaryStage.close();
                // or Platform.exit();
            }
        }
    );
    
    primaryStage.getScene().getAccelerators().put(
        KeyCombination.keyCombination("CTRL+C"),
        new Runnable() {
            @Override
            public void run() {
                Platform.exit();
            }
        }
    );