2017-07-30 13 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(); 
    } 
} 

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クラスを拡張しているのですか?または私はそれが間違ってやっています。

+0

どこで 'myapp'を宣言しますか? –

+0

新しい答えをご覧ください。 –

+0

'Application.launch()'はリフレクションによってアプリケーションクラスの新しいインスタンスを作成します。匿名クラスは、クラスの名前を付けずに、クラスのインスタンスを1回作成するために使用されます。その後、クラスの別のインスタンスを作成するために 'Application.launch()'が必要になるため、匿名クラスを使用することはこれを行う正しい方法ではありません。必要に応じて、リンクされた質問のように、名前付き内部クラス(publicでなければならない)を作成することができます。 –

答えて

1

すでに匿名の内部クラスを作成してApplicationを拡張していることに注意してください。ただし、JavaFXでは、名前付きクラスからApplicationを拡張する必要があります。これは、launch()staticメソッドであり、リフレクションによってApplicationインスタンスを作成するためです。あなたがlaunch()と呼ぶ方法は、この事実を隠します。 myapp.launch()ではなくApplication.launch()に電話するほうが良いでしょう。launch()staticであることが明らかになるからです。

+0

OPは既に 'Application'を拡張しています。 –

+0

@James_D技術的には、匿名の内部クラスは 'Application'を拡張しています。しかし、指定されたクラスは 'Application'を拡張する必要があります。 –

+0

問題は(メソッドの便利なバージョンを使用しない限り) 'Application.launch()'はアプリケーションクラスを提供する必要があります。これは、そのクラスを匿名にすると実行できません。 –

関連する問題