2017-01-14 6 views
0

メインアプリケーションのinitメソッドが呼び出される前に、dialog(Stage)を表示する最善の方法を知りたいと思います。 initメソッドで実装することはできません。なぜなら、JavaFXアプリケーションスレッドでは実行されないため、startメソッドで実装するときには、プリローダのオプションが失われてしまいます。正しく)。初期化前のjavafxショーダイアログ

eclipseのワークスペースチューザーやlightroomのカタログチューザーのようなものでなければなりません。

私が考えることができる解決策は、2つのプログラム、1つのスターターとメインアプリケーションを作成することですが、同じアプリケーションで発生する可能性がある場合はそれを好むでしょう。そのようにしかできないのであれば、のapp.jarをスターターが起動したのと同じJavaバージョンで起動するにはどうしたらいいですか?(パスに設定されたJavaバージョンでは呼び出さないでください。コマンドライン/端末で異なるバージョンのアプリケーションを起動することができます)。

ご協力いただきありがとうございます。

+0

は、なぜあなたはこれを実行する必要がありますか? 'init()'メソッドは、FXアプリケーションライフサイクルの初期化の一部です。これが完了する前にアプリケーションの一部を実行することはほとんどありません。なぜなら、いつものように 'start()'メソッドでダイアログを表示するだけでなく、ダイアログが閉じられたときに、メインのアプリケーションウィンドウを表示する前に必要な処理は何ですか? –

+0

@James_Dプレローダー/スプラッシュスクリーンのために十分な時間を取っているコードがユーザーの選択の後に起こるので、プレローダーのライフサイクルは 'init()'メソッド中にあるので、ユーザーはプログレスバーが表示されずにメインのアプリケーションステージが表示されるまでには数秒間待ってください。これは、メインステージが表示されるまで、 'start()'メソッドのスプラッシュ画面を示す進捗状況としてプリローダーを必要とせず、装飾レスダイアログを開くことを意味しますか? – Scourge

+1

プリロード機構を使うだけでいいです。'start()'メソッドのプログレスバーを表示するスプラッシュ画面を表示するのは簡単ですが(バックグラウンドスレッドのタスクで時間がかかることを何でもしてください)、完了したらメイン画面を表示してください。 –

答えて

0

JavaFXアプリケーションの起動は、Application.launch()LauncherImpl#launchApplicationが呼び出されます)を呼び出すことによって実行されます。 launchApplication

launchApplicationpreloaderClass引数は、次のシグネチャを持つと呼ばれるプライベート方法:

は今preloaderクラスあなたがダイアログを呼び出す場所であります

ちょうどあなたのダイアログを呼び出し、あなたの他の機能ここ置く:

public class MyPreloader extends Preloader { 
    private Stage preloaderStage; 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     this.preloaderStage = primaryStage; 

     VBox loading = new VBox(20); 
     loading.setMaxWidth(Region.USE_PREF_SIZE); 
     loading.setMaxHeight(Region.USE_PREF_SIZE); 
     loading.getChildren().add(new ProgressBar()); 
     loading.getChildren().add(new Label("Please wait...")); 

     BorderPane root = new BorderPane(loading); 
     Scene scene = new Scene(root); 

     primaryStage.setWidth(800); 
     primaryStage.setHeight(600); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    @Override 
    public void handleStateChangeNotification(StateChangeNotification 
     stateChangeNotification) { 

     if (stateChangeNotification.getType() == Type.BEFORE_START) { 
      preloaderStage.hide(); 
     } 
    } 
} 

をそしてlaunchApplication方法にそれを渡します。

And just perfect!
Enjoy!

+0

これまでのご回答いただきありがとうございますが、実際にどうすればよいのか分かりません。ダイアログのユーザーアクションがinitメソッドの重要な変数を設定する必要があるか、スタートアップ全体をキャンセルする必要があるため、メインアプリケーションが初期化される前に(ダイアログが表示される前に)ダイアログが表示されるはずです。 あなたのアイデアに関する質問:私はプリローダーに置く必要がありますが、initメソッドがユーザー入力が初期化を続けるのを待って、preloaderの "スプラッシュ画面"を進捗状況で表示する方法を教えてください。 – Scourge

+0

しかし、あなたはあなたの処分にStageオブジェクトを持っていませんか? – GingerHead

+0

はい、私はそれを持っていますが、残りの質問は、ユーザーが選択を行う前にメインアプリケーションの 'init()'メソッドが実行されないようにするにはどうすればいいですか? 主なアプリケーションの 'start()'メソッドでユーザーの選択、スプラッシュ画面と読み込みを実装することで、異なるアプローチが可能ですが、少し洗練された構造になります。 – Scourge