为什么JavaFx应用程序必须从它自己的类中启动?

Rez*_*eem 1 java javafx

我尝试了以下代码,并被迫在Viewer不直接调用该方法的情况下启动我调用的JavaFx应用程序launch.

这是JavaFx类:

package Freelance;

public class Viewer extends Application
{
    private WebEngine myWebEngine;

    public void start(Stage stage)
    {
        stage.setTitle("Browser");

        WebView myBrowser = new WebView();
        myWebEngine = myBrowser.getEngine();
        myWebEngine.getLoadWorker().exceptionProperty().addListener(new ChangeListener<Throwable>()
        {
            @Override
            public void changed(ObservableValue<? extends Throwable> observableValue, Throwable oldException,
                    Throwable exception)
            {
                System.out.println("WebView encountered an exception loading a page: " + exception);
            }
        });
        myBrowser.setPrefSize(1600, 900);

        BorderPane root = new BorderPane();
        root.setCenter(myBrowser);
        stage.setScene(new Scene(root));
        stage.show();
        myWebEngine.load("http://www.google.com/");

    }

    public static void run()
    {
        launch("");
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试从一个单独的类启动它时,如下所示:

package Freelance;

public class Test
{

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

}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Exception in thread "main" java.lang.RuntimeException: Error: class Freelance.Test is not a subclass of javafx.application.Application
    at javafx.application.Application.launch(Application.java:254)
    at Freelance.Test.main(Test.java:8)
Run Code Online (Sandbox Code Playgroud)

但是,如果我Test像这样更改类:

package Freelance;

public class Test
{

    public static void main(String[] args)
    {
        Viewer.run(); // Changed from using "launch()" to "run()"
    }

}
Run Code Online (Sandbox Code Playgroud)

然后它工作并正确启动.

所以我只是好奇为什么会发生这种情况,或者我是以不正确的格式编写代码.

谢谢.

fab*_*ian 7

由于launch是静态方法,因此在编译之后,不能通过检查堆栈之外的方式来确定应用程序类

Application.launch("");
Run Code Online (Sandbox Code Playgroud)

字节码中的结尾相同

Viewer.launch("");
Run Code Online (Sandbox Code Playgroud)

检查堆栈是否有效,如果你可以Application在堆栈中的某个地方找到类,这就是launch需要从Application类中调用的原因.

然而有一个选择:
你可以在传递Application的重载版本的launch方法:

Application.launch(Viewer.class, "");
Run Code Online (Sandbox Code Playgroud)