JavaFX Application类 - 默认构造函数和init方法之间的区别

时间:2016-01-14 09:40:56

标签: java javafx

我写了一个小测试应用程序,如下所示:

import javafx.application.Application;
import javafx.application.Platform;
import javafx.stage.Stage;

public class Test extends Application {

    public Test() {
        System.out.println("first");
    }

    @Override
    public void init() throws Exception {
        System.out.println("second");
        super.init();
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        System.out.println("third");
        Platform.exit();
    }

    @Override
    public void stop() throws Exception {
        System.out.println("fourth");
        super.stop();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

输出结果为:

first
second
third
fourth

现在,我在问自己,使用默认构造函数或init方法来初始化一些必需的东西之间存在差异。

谢谢!

P.S。:这个问题与this one不重复,因为我的问题不处理变量的初始化。我的问题是JavaFX具体!

2 个答案:

答案 0 :(得分:6)

启动Application时,在启动过程中执行以下步骤:

  1. 创建应启动的Application子类的实例。 (构造函数被称为)
  2. 调用该实例的init()
  3. 调用该实例的start方法。
  4. See javadoc for Application

    由于在调用start方法后exit the application,因此调用实例的stop方法。

    请注意,无需使用super.init()super.stop()

    来自javadoc

      

    initstop方法具有无效的具体实现。



    构造函数initstart的差异是:

    构造

    如果您的应用程序不是final,则可以扩展应用程序类。由于扩展类的构造函数不完整,因此将对类的引用传递给此状态中的其他类可能会很危险。此外,实例尚未初始化为getParameters方法返回参数的点。

    init

    通常应该在此方法中进行初始化。此方法不是从fx应用程序线程运行的,因此有些事情无法通过此方法完成,例如创建Stage

    start

    初始化的最后一步。做一些需要从应用程序线程运行的东西。但是,请注意不要使用长时间运行来阻止此线程,因为这会冻结GUI。

答案 1 :(得分:-1)

具有覆盖的init()方法的应用程序类。 在Test类构造之后,Init方法将立即调用。 Init方法实际上是Application Class的内部方法。这种方法实际上是在内部初始化整个FX应用程序组件。

Application class JavaDoc

它可以在此方法中构造其他JavaFX对象。