2017-07-30 175 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()'需要您提供應用程序類,如果您將該類匿名化,則不可能這樣做。 –