不继承Application类的JavaFX

3

当我们创建JavaFX应用程序时,通常会扩展Application类。

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();
    }
}

但我能不扩展Application类来实现吗? 我尝试过创建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

需要扩展Application类吗?或者我做错了什么。


你在哪里声明myapp - undefined
请查看新答案。 - undefined
Application.launch() 使用反射创建应用程序类的新实例。匿名类用于创建一个单一、一次性的类实例,而无需给类命名。由于您随后需要使用 Application.launch() 来创建类的另一个实例,使用匿名类并不是正确的方法。如果您愿意,可以像链接中的问题所示,创建一个命名的内部类(必须是公共类)。 - undefined
1个回答

2
请注意,通过创建匿名内部类,您已经扩展了Application。然而,JavaFX要求您从命名类继承Application。这是因为launch()是一个静态方法,它通过反射创建Application实例。在这里调用launch()的方式隐藏了这个事实。最好调用Application.launch()而不是myapp.launch(),因为这使得launch()是静态的更加清晰易懂。

尽管如此,OP已经扩展了 Application - undefined
@James_D 从技术上讲,匿名内部类确实扩展了Application。然而,似乎命名类必须扩展Application - undefined
问题在于(除非你使用了方法的便利版本)Application.launch() 要求你提供应用程序类,但如果你将该类设为匿名类,这是不可能的。 - undefined
@James_D 你仍然可以使用 myapp.getClass() 来获取匿名类的 Class 对象。然而,JavaFX要求一个无参数构造函数,而匿名类没有这个函数。 - undefined
1
如果你检查堆栈跟踪,会发现它调用了getConstructor(),这个方法明确只会检查公共构造函数。如果你使用myapp.getClass().getDeclaredConstructor(),你会看到构造函数是存在的(isAccessible()在该构造函数上返回false)。在这一点上有点多余。 - undefined
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接