我尝试了以下代码,并被迫在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)
然后它工作并正确启动.
所以我只是好奇为什么会发生这种情况,或者我是以不正确的格式编写代码.
谢谢.
由于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)
| 归档时间: |
|
| 查看次数: |
682 次 |
| 最近记录: |