2013-06-15 51 views
5

私が作っている既に実行中のアプリケーションを閉じてから再起動するには、ボタンをクリックするなどしてアプリケーションを再起動する他の言語では、私はJavaFxとJavaの初心者です。この問題の解決策を教えてください。JavaFxでアプリケーションを再起動

+1

はい、それについてです。しかし、なぜあなたは言語を変更するためにアプリを再起動する必要がありますか?たぶん、再起動せずに変更することはできますか?あなたのアプリの言語設定は何ですか? –

+0

さて、私はこれらのメカニズムについてよく分かりませんが、私が望むのは、他の言語のすべてのオブジェクト/コントロールを再定義することです。 – AymenDaoudi

+0

[JavaFX 2と国際化]の@UlukBiyのソリューションをチェックしてください(http://stackoverflow.com/questions/10143392/javafx-2-internationalization)の質問です。 – tarrsalah

答えて

7

この質問には詳細がありません。 JavaFXアプリケーションについて言及しましたが、アプリケーションのデプロイ方法を理解することが重要です。 Webブラウザ、Java Web Startアプリケーション、スタンドアロンのJAR、または自己完結型のネイティブアプリケーションとして実行されていますか?どのようにアプリケーションを始めるのですか?これらの質問に答えがあれば、具体的な質問に簡単に答えることができます。

次の例はJavaFXではありませんが、ここで使用されているアプローチは、JavaFXアプリケーションをデプロイできるいくつかの方法で機能します。うまく動作するアプリケーションを再起動する方法の1つは、スクリプトからアプリケーションを起動することです。スクリプトの中にはwhileループがあり、プログラム終了コードに基づいてプログラムを継続的に再起動します。ここでは、Linuxプラットフォーム上でのIntelliJを開始bashシェルスクリプトの例です。この例では

while true ; do 
    eval "$JDK/bin/java" $ALL_JVM_ARGS -Djb.restart.code=88 $MAIN_CLASS_NAME $* 
    test $? -ne 88 && break 
done 

、起動スクリプトは、アプリケーションのパラメータとして「jb.restart.code」を渡しています。 IntelliJが再起動したい場合、その値88を終了コードとして返します。スクリプトはアプリケーションの終了コードを観察し、値が88の場合はアプリケーションを再起動します。

このアプローチはほとんどのプラットフォームでうまくいきますが、スクリプトを使用してアプリケーションを開始する必要があります。

+0

ネイティブ自己完結型アプリケーションについてはどうですか? –

+0

それがネイティブな自己完結型アプリケーションであれば、どのOSが元のOSですか?これらの詳細は、答えが何であるかに違いがあります。 – axiopisty

+0

現在、私はexecでSystem.exit()を実行してWindowsソリューションを実装しました。私は、LinuxとMacOSが相対的なシェルコマンドで同じ経路をたどると考えています。 –

2

解決策の1つは、起動スクリプトのcommandlineとworking dirをmain()メソッドに渡すことです。 ProcessBuilderを使用すると、アプリケーションを再起動できます。もう一つの可能​​性は、カスタムクラスローダーでアプリケーション全体を開始することです(例えば、Springプロジェクトはソースベースに適切なクラスローダーを持っています)。基本的にはメインクラスを別のクラスローダーで起動して再起動することができます。最初のインスタンス。

+0

これは実際には非常に新しく、ちょっと混乱していますあなたの答えを得ていない、私に助けてくれるかもしれないコードを教えてもらえますか、それを説明する記事を参照してください。 – AymenDaoudi

+0

実際にはClassloaderの特徴はかなり複雑です。 JavaからOSプロセスを開始することができるので、Java実行可能ファイルの場所とクラスパスの設定方法を知ることが必要です。 クラスパスについては、System.getProperty( "java.class.path")などを使用して見つけることができます。起動時にアプリケーションに渡さなければならないjava.exeの場所。 Runtime.getRuntime()。exec(..)を使用するか、ProcessBuilderだけでアプリケーションの完全なコピーを開始できます。 –

+0

私はそれを試して、あなたの助けのためにthxを参照してください – AymenDaoudi

1
retstart.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent t) { 
      if(getOnCloseRequest()!=null){ 
       getOnCloseRequest().handle(new WindowEvent(getScene().getWindow(), WindowEvent.WINDOW_CLOSE_REQUEST)); 
//write code to invoke application instance again 
      }else{ 
       close(); 
      } 

     } 
    }); 
関連する問題