gpt4 book ai didi

java - JavaFX 8 如何在几乎为空的应用程序类中启动 JavaFX 应用程序线程?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:51:39 24 4
gpt4 key购买 nike

比方说,我们有以下类:

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

public class Test extends Application
{
public Test()
{
System.out.println("Constructor");
}

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

public static void main(String... args)
{
System.out.println("main");
}
}

它派生自 Application 但不使用其任何方法。通常,您通过在主程序中调用 launch(args) 来启动 JavaFX 应用程序。

当我启动此程序时,唯一的输出是“main”,因此不会调用构造函数和启动程序,但程序不会终止,因为有一个 JavaFX 应用程序线程正在运行。但它从何而来?

我做了一些调试,发现线程是在main方法运行之前从主线程启动的。堆栈跟踪以 NativeMethodAccessorImpl 开头。

更奇怪的是:当我从另一个类启动 main 方法时,JavaFX 应用程序线程没有启动:

public class Test2
{
public static void main(String[] args)
{
Test.main(args);
}
}

这是什么黑魔法?

最佳答案

Java 使用不同的方法来启动这两个应用程序。

尝试运行以下代码:

public class Test3 {

public static void main(String[] args) {

Class<?> actualMainClassTest = LauncherHelper.checkAndLoadMain(true, 1, Test.class.getName());
Class<?> actualMainClassTest2 = LauncherHelper.checkAndLoadMain(true, 1, Test2.class.getName());

System.out.println("Actual loaded main class for Test: " + actualMainClassTest.getName());
System.out.println("Actual loaded main class for Test2: " + actualMainClassTest2.getName());
}
}

输出是

  • 实际加载的测试主类:sun.launcher.LauncherHelper$FXHelper
  • Test2 的实际加载主类:Test2

可以看到Test2类实际加载的主类是Test2,但是加载的主类是Test2测试sun.launcher.LauncherHelper$FXHelper

发生这种情况是因为 Java 启动器检查要启动的主类是否是 javafx.application.Application 的子类。如果是,它会加载 sun.launcher.LauncherHelper$FXHelper 的主要方法,调用启动器方法对于 JavaFX 应用程序 (com.sun.javafx.application.LauncherImpl#launchApplication)。

此方法负责启动 JavaFX 应用程序。 Test#main 在应用程序启动后调用:

enter image description here

当 Test2 调用 Test#main 时,不使用 FX 启动器,因为 Test2 不是 javafx.application.Application 的子类。

关于java - JavaFX 8 如何在几乎为空的应用程序类中启动 JavaFX 应用程序线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28321369/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com