【问题标题】:JavaFX Application class - difference between default constructor and init methodJavaFX 应用程序类 - 默认构造函数和 init 方法之间的区别
【发布时间】:2016-01-14 09:40:55
【问题描述】:

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

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 具体的!

【问题讨论】:

  • 可能唯一的区别是在init 中你可以获取参数——见here 和here

标签: java javafx


【解决方案1】:

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

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

See javadoc for Application

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

注意,不需要使用super.init()和super.stop():

来自 javadoc

init 和 stop 方法有具体的实现,什么都不做。



构造函数init和start的区别是:

构造函数

如果您的应用程序不是final,则可以扩展应用程序类。由于扩展类的构造函数不完整,在这种状态下将类的引用传递给其他类可能是危险的。此外,实例还没有初始化到getParameters 方法返回参数的程度。

init

初始化一般应该在这个方法中完成。此方法不是从 fx 应用程序线程运行的,因此无法通过此方法完成某些操作,例如创建 Stage。

start

初始化的最后一步。在此处执行需要从应用程序线程运行的事情。但是注意不要用长时间运行的操作阻塞这个线程,因为这会冻结 GUI。

【讨论】:

    【解决方案2】:

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

    Application class JavaDoc

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

    【讨论】:

    • 这里所说的一切,对于构造函数也是如此。
    猜你喜欢
    • 1970-01-01
    • 2016-02-08
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多