2017-07-30 181 views
0

当我们创建一个javafx应用程序时,我们通常扩展Application类。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 

是有必要扩展应用程序类?还是我做错了。

+0

你在哪里声明'myapp'? –

+0

查看新的答案。 –

+0

'Application.launch()'通过反射创建应用程序类的新实例。一个匿名类用于创建一个单一的一个类的实例,而不用命名该类。由于您随后需要'Application.launch()'创建该类的另一个实例,因此使用匿名类并不是正确的方法。如果你喜欢,你可以创建一个命名的内部类(必须是公共的)。 –

回答

1

请注意,您已通过创建匿名内部类扩展Application。但是,JavaFX要求您从命名类扩展Application。这是因为launch()是通过反射创建Application实例的static方法。您在这里拨打launch()的方式隐藏了这一事实。最好是拨打Application.launch()而不是myapp.launch(),因为这样可以清除launch()static

+0

尽管OP已经在扩展Application。 –

+0

@James_D从技术上讲,是的,匿名内部类扩展了'Application'。但是,看起来命名类必须扩展'应用程序'。 –

+0

问题在于(除非使用方法的便利版本)'Application.launch()'需要您提供应用程序类,如果您将该类匿名化,则不可能这样做。 –