JavaFX2 - 无GUI启动应用程序的选项

时间:2016-09-14 11:45:23

标签: javafx-2

我正在开发将在Linux下运行的JavaFx应用程序,包括支持GUI的环境和不支持GUI的环境。 这意味着,如果我连接到应用程序将在启动应用程序时使用“ssh -X”运行应用程序的GUI应该打开,如果我只使用“ssh”连接(不使用-X),则应启动应用程序的控制台版本。

使用JavaFx时如何实现这一目标?

我按照以下方式尝试了它:

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {

        FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource("MainGui.fxml"));
        SplitPane page = null;
        try {
            page = (SplitPane) loader.load();
        } catch (IOException e) {
            System.exit(1);
        }   

        Scene scene = new Scene(page);
        primaryStage.setScene(scene);
        primaryStage.setResizable(false);

        primaryStage.show();

    }

    public static void main(String[] args) {

        if (args.length == 1 && args[0].equals("nogui")) {
            System.out.println("NOGUI SELECTED");
        } else {
            launch(args);
        }
    }
}

但它没有用,当我尝试通过SSH连接到没有-X选项的另一台机器时,我仍然收到错误:

Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.UnsupportedOperationException: Unable to open DISPLAY
        at com.sun.glass.ui.gtk.GtkApplication.<init>(GtkApplication.java:68)
        at com.sun.glass.ui.gtk.GtkPlatformFactory.createApplication(GtkPlatformFactory.java:41)
        at com.sun.glass.ui.Application.run(Application.java:146)
        at com.sun.javafx.tk.quantum.QuantumToolkit.startup(QuantumToolkit.java:257)
        at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:211)
        at com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:675)
        at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:337)
        at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
        ... 5 more

我还注意到如果我在带有GUI的环境中运行应用程序,给出“nogui”命令行选项,我会收到打印输出“NOGUI SELECTED”,但应用程序不会结束它的执行,而只是挂在那里。

你能帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

我不确定究竟是什么导致您面临的这个问题。但是已知JavaFX存在线程问题,这可能与JavaFX Main Class产生子线程有关。但我不足以回答这个问题。

但我可以做的是,如果你正在寻找一个,那么提供另一种选择。您可以使用main方法创建一个单独的类(不扩展Application类),然后根据需要调用Main类,这样,如果传递 nogui ,您的应用程序将退出。

public class NewMain {
    public static void main(String[] args) throws Exception {
        if (args.length == 1 && args[0].equals("nogui")) {
            System.out.println("NOGUI SELECTED");
        } else {
            Main.launch(Main.class, args);
        }
    }
}

如果您不想传递参数,则只需使用Main.launch(Main.class)代替Main.launch(Main.class, args)即可。我没有测试过,但它应该工作。

答案 1 :(得分:0)

在Ubuntu上用javafx作为root来引用我在其他地方的答案...也许这可以帮助别人。我有同样的问题,但对于普通用户。假设我想使用用户帐户foo启动firefox。我以条形式登录:

[bar@localhost ~]$ sudo -u foo -H firefox

可悲的是,该命令失败并出现与问题相同的错误(即没有指定协议且无法打开显示)

我的解决方案是简单地将用户foo添加到授权访问X服务器的列表中。

xhost si:localuser:foo

就是这样,我可以使用sudo和用户foo启动Firefox(以及其他X应用程序)。