我正在开发将在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”,但应用程序不会结束它的执行,而只是挂在那里。
你能帮我解决这个问题吗?
答案 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应用程序)。