2016-09-14 105 views
2

我正在開發將在Linux下運行的JavaFx應用程序,兩者都支持GUI和不支持GUI的環境。 這意味着,如果我連接到應用程序啓動GUI時應用程序將以「ssh -X」運行的機器,並且如果我使用「ssh」(不帶-X)連接,則應啓動應用程序版本的應用程序。JavaFX2 - 用於在沒有GUI的情況下啓動應用程序的選項

如何在使用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

您是如何創建JAR文件的?裏面的Manifest.MF文件是什麼?它可能被配置爲啓動JavaFX'Application'類而不調用'main'方法。 編輯:其實,這可能只適用於使用JavaFX Packager,我不確定。 – Itai

+0

我在Manifest.MF中看到我有主要方法的路徑。 – Xyster

+0

你如何運行你的應用程序? – Itai

回答

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)。我沒有測試過,但它應該工作。

+0

這工作,謝謝。 – Xyster

0

引用來自其他地方的答案,以javafx作爲root用戶在Ubuntu上工作......也許這可以幫助別人。我和你有同樣的問題,但對於普通用戶。假設我想使用用戶帳戶foo啓動firefox。我登錄的酒吧:

[[email protected] ~]$ sudo -u foo -H firefox

可悲的是該命令中的問題失敗,相同的錯誤(即沒有協議規定&無法打開顯示器)

我的解決辦法是簡單地添加用戶foo到X服務器的授權訪問列表。

xhost si:localuser:foo

,就是這樣,當時我能夠使用sudo和用戶foo推出火狐(和其他X應用程序)。

相關問題