不扩展应用程序类的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

当我们创建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.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)。在这一点上有点多余。