我写了一个小测试应用程序,如下所示:
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
具体!
答案 0 :(得分:6)
启动Application
时,在启动过程中执行以下步骤:
Application
子类的实例。 (构造函数被称为)init()
。start
方法。由于在调用start
方法后exit the application,因此调用实例的stop
方法。
请注意,无需使用super.init()
和super.stop()
:
来自javadoc
init
和stop
方法具有无效的具体实现。
构造函数init
和start
的差异是:
如果您的应用程序不是final
,则可以扩展应用程序类。由于扩展类的构造函数不完整,因此将对类的引用传递给此状态中的其他类可能会很危险。此外,实例尚未初始化为getParameters
方法返回参数的点。
init
通常应该在此方法中进行初始化。此方法不是从fx应用程序线程运行的,因此有些事情无法通过此方法完成,例如创建Stage
。
start
初始化的最后一步。做一些需要从应用程序线程运行的东西。但是,请注意不要使用长时间运行来阻止此线程,因为这会冻结GUI。
答案 1 :(得分:-1)
具有覆盖的init()方法的应用程序类。 在Test类构造之后,Init方法将立即调用。 Init方法实际上是Application Class的内部方法。这种方法实际上是在内部初始化整个FX应用程序组件。
它可以在此方法中构造其他JavaFX对象。