不扩展应用程序类的JavaFX
当我们创建javafx应用程序时,通常会扩展应用程序类不扩展应用程序类的JavaFX,java,oop,javafx,extends,Java,Oop,Javafx,Extends,当我们创建javafx应用程序时,通常会扩展应用程序类 public class Myjavafx extends Application{ public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage){ Button btn = new Button(); btn.se
public class Myjavafx extends Application{
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage){
Button btn = new Button();
btn.setText("click me");
BorderPane pane = new BorderPane();
pane.setCenter(btn);
Scene scene = new Scene(pane, 300,250);
primaryStage.setScene(scene);
primaryStage.setTitle("my app");
primaryStage.show();
}
}
但是我能在不扩展应用程序类的情况下完成吗?
我试图创建javafx应用程序,但没有扩展它
public class Myjavafx{
public static void main(String[] args) {
Application myapp = new Application(){
@Override
public void start(Stage primaryStage){
Button btn = new Button();
btn.setText("click me");
BorderPane pane = new BorderPane();
pane.setCenter(btn);
Scene scene = new Scene(pane, 300,250);
primaryStage.setScene(scene);
primaryStage.setTitle("my app");
primaryStage.show();
}
};
myapp.launch(args);
}
}
但结果却是一个错误
class Myjavafxis not a subclass of javafx.application.Application
有必要扩展应用程序类吗?还是我做错了。请注意,您已经通过创建匿名内部类扩展了
应用程序。但是,JavaFX要求您从命名类扩展应用程序
。这是因为launch()
是一种static
方法,它通过反射创建应用程序
实例。这里调用launch()
的方式隐藏了这一事实。最好调用Application.launch()
而不是myapp.launch()
,因为这表明launch()
是static
在哪里声明myapp
?请参阅新答案。Application.launch()
通过反射创建应用程序类的新实例。匿名类用于创建类的单个一次性实例,而不命名该类。由于随后需要Application.launch()
来创建该类的另一个实例,因此使用匿名类并不是正确的方法。如果愿意,您可以像链接的问题中那样创建一个命名的内部类(必须是公共的)。不过OP已经在扩展应用程序
。@James\u D从技术上讲,是的,匿名内部类扩展了应用程序
。但是,命名类似乎必须扩展应用程序
。问题是(除非您使用方便的方法版本)应用程序。launch()
要求您提供应用程序类,如果您使该类匿名,这是不可能做到的。@James\D感谢您的澄清。我用更多的细节编辑了我的答案。如果你检查堆栈跟踪,它将调用getConstructor()
,它将显式地只检查公共构造函数。如果您这样做,例如,myapp.getClass().getDeclaredConstructor()
您将看到构造函数存在。(isAccessible()
在该构造函数上返回false)。在这一点上有点多余。