忍者ブログ

≪ 前の記事

次の記事 ≫

  • [PR]

    ×

    [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

    comments

  • JavaFXにmain関数がいらない理由

    JavaFXtitle画像
    JavaFXにおいてmain関数を作る必要はありません。
    Javaを学んだ人にとって最初に違和感を感じる部分だと思います。

    かく言う自分も不思議に思い、調べてみたのでまとめておきます。


    拍手[0回]



    まずstartメソッドの詳細をJavaAPIドキュメントで探してみると、以下のような内容が書いてありました。


        start
    
        public abstract void start(Stage primaryStage) throws Exception
    
        すべてのJavaFXアプリケーションのメイン・エントリ・ポイント。
        startメソッドは、initメソッドが戻った後、
        およびシステムでアプリケーションの実行開始の準備が整った後に呼び出されます。
    
        注意: このメソッドはJavaFXアプリケーション・スレッドで呼び出されます。
    
        パラメータ:
            primaryStage - アプリケーション・シーンを設定できる、
            このアプリケーションのプライマリ・ステージ。
            プライマリ・ステージは、アプリケーションがアプレットとして起動された場合は
            ブラウザに埋め込まれます。
            アプリケーションは、必要な場合は他のステージを作成できますが、
            それらはプライマリ・ステージではなく、ブラウザに埋め込まれません。
        例外:
            Exception
    
    


    ここの説明文じゃちょっと分からないですね。


    このメソッドはJavaFXアプリケーション・スレッドで呼び出されます。
    と書いてあるので、 次はApplicationクラスの概要を覗いてみます。


    すると以下のような流れが書いてありました。


    ライフサイクル
    
    JavaFXアプリケーションのエントリ・ポイントはApplicationクラスです。
    アプリケーションが起動されると常に、
    JavaFXランタイムにより次のことがこの順序で実行されます。
    
        1. 指定されたApplicationクラスのインスタンスを構築します。
        2. init()メソッドを呼び出します。
        3. start(javafx.stage.Stage)メソッドを呼び出します。
        4. 次のいずれかが発生した場合、アプリケーションの完了を待機します。
            アプリケーションによりPlatform.exit()が呼び出される場合
            最後のウィンドウが閉じられ、かつPlatformのimplicitExit属性がtrueである場合
        5. stop()メソッドを呼び出します。
    
    


    最初にinit()メソッドで初期化して、start()メソッドを呼び出し、処理が終わったらstop()メソッドで閉じる。

    一言で言ってしまうと、JavaFXランタイムっていうやつのおかげで、アプリケーション起動時に自動的に色々な手続きを勝手にしてくれているみたいです。


    そんな概念的な話じゃ納得できない!という方は、詳しく調査されたブログがありましたのでそちらをご覧になってみてください。
    → torutkの日記 さん



    なぜlaunch()メソッドが使われるのか

    ちなみにJavaFXでよく目にするコードは以下のような形です。

    public class Main extends Application {
    	public void start(Stage primaryStage) {
    		VBox vbox = new VBox();
    		Scene scene = new Scene(vbox,600,400);
    		primaryStage.setScene(scene);
    		primaryStage.show();
    	}
    	
    	public static void main(String[] args) {
    		launch(args);
    	}
    }


    ここまでmain()メソッドが不要となる理由を探してきましたが、そうすると逆になぜmain()メソッドと併用することがあるのか。

    話は単純でstart()メソッドはあくまでApplicationクラスの継承クラスでなければ利用できませんので、その他の機能を持たせようとすると必然的にmain()メソッドが必要になってくるのでしょう。

    0 comments

Comment