2016-09-14 10 views
2

GUIをサポートする環境とGUIをサポートしない環境の両方で、Linuxで動作するJavaFXアプリケーションを開発しています。 意味は、アプリケーションが起動するときに "ssh -X"で実行されるマシンに接続すると、GUIが開き、 "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); 
     } 
    } 
} 

しかし、それは動作しませんでした、と私は、-Xオプションを使用せずに別のマシンにSSH経由で接続しようとしたときに、私はまだエラーが表示さ:

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 

"nogui"コマンドラインオプションを指定してGUIで環境を実行すると、 "NOGUI SELECTED"という出力が表示されますが、アプリケーションは実行を終了しません。

私はこれをどのように達成することができますか?

+0

JARファイルはどのように作成しましたか?内部の 'Manifest.MF'ファイルには何がありますか? 'main'メソッドを呼び出さずにJavaFXの' Application'クラスを起動するように設定されている可能性があります。 編集:実際には、これはJavaFX Packagerを使用している場合にのみ当てはまりますが、わかりません。 – Itai

+0

私はManifest.MFを参照してください。私はmainメソッドへのパスを持っています。 – Xyster

+0

あなたはどのようにあなたのアプリケーションを実行しますか? – Itai

答えて

3

あなたが直面しているこの問題を引き起こしている正確な原因はわかりません。しかし、JavaFXにはスレッドの問題があることが知られています。これは、JavaFX Main Classの子スレッドの生成に関連している可能性があります。しかし、私はそれに答えるのに十分知識がありません。

しかし、私はになります。は、あなたが1つを探している場合は、代替手段を提供します。別のクラス(アプリケーションクラスを拡張しない)をメインメソッドで作成し、そこから必要に応じて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

Ubuntuでjavafxをrootとして使っていた場所の回答を引用すると、おそらく他の人に役立つかもしれません。私はあなたと同じ質問をしましたが、普通のユーザーの場合は同じです。ユーザーアカウントfooを使ってfirefoxを起動したいとしましょう。私はバーとしてログインしています:質問に同じエラーで失敗したコマンド

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

悲しいこと(つまり、何のプロトコルが指定されていない&を開くことができません表示)

私のソリューションは、単に追加しましたユーザーfooをXサーバーへのアクセス許可のリストに追加します。

xhost si:localuser:foo

そして、それはそれだった、私はsudoのとユーザーFOOを使用して、その後のFirefox(および他のXアプリケーション)を起動することができました。

関連する問題