サブクラスの 1 つの新しいインスタンスを直接呼び出すことでこれを機能させることができますが、これはちょっとしたハックのように感じられ、メソッドの意図された使用法に反します。(単に意味的に: 呼び出されたクラスで呼び出されたメソッドは、アプリケーションが既に実行されている任意の時点ではなく、アプリケーションの開始時に実行する必要があります。)start(...)
Application
start(...)
start
Application
このメソッドは、従来の Java アプリケーションstart
のメソッドを置き換えるものと考える必要があります。main
あるアプリケーションが別のアプリケーションのmain
メソッドを呼び出す場合、(うまくいけば) 構造化が間違っているという結論に達するでしょう。
したがって、個々のコンポーネントがアプリケーションのサブクラスではなく、単純な古い通常のクラスになるように、設計をリファクタリングすることをお勧めします。
public class FirstModule {
// can be any Parent subclass:
private BorderPane view ;
public FirstModule() {
// create view; you could also just load some FXML if you use FXML
view = new BorderPane();
// configure view, populate with controls, etc...
}
public Parent getView() {
return view ;
}
// other methods as needed...
}
同様に、
public class SecondModule {
private GridPane view ;
public SecondModule {
view = new GridPane();
// etc etc
}
public Parent getView() {
return view ;
}
}
これで、次のようなことができます
FirstModule firstModule = new FirstModule();
Scene scene = new Scene(firstModule.getView());
Stage stage = new Stage();
stage.setScene(scene);
stage.show();
必要な場所ならどこでも。したがって、モジュールごとにスタンドアロン アプリケーションを作成できます。
public class FirstApplication extends Application {
@Override
public void start(Stage primaryStage) {
Scene scene = new Scene(new FirstModule().getView());
primaryStage.setScene(scene);
primaryStage.show();
}
}
または、より大きなアプリケーションの一部としてそれらをインスタンス化できます。
public class CompositeModule {
private HBox view ;
public CompositeModule() {
Button first = new Button("First Module");
first.setOnAction(e -> {
Parent view = new FirstModule().getView();
Scene scene = new Scene(view);
Stage stage = new Stage();
stage.initOwner(first.getScene().getWindow());
stage.setScene(scene);
stage.show();
});
Button second = new Button("Second Module");
second.setOnAction(e -> {
Parent view = new SecondModule().getView();
Scene scene = new Scene(view);
Stage stage = new Stage();
stage.initOwner(second.getScene().getWindow());
stage.setScene(scene);
stage.show();
});
HBox view = new HBox(10, first, second);
view.setAlignment(Pos.CENTER);
}
public Parent getView() {
return view ;
}
}
と
public class CompositeApplication extends Application {
@Override
public void start(Stage primaryStage) {
Scene scene = new Scene(new CompositeModule().getView(), 360, 150);
primaryStage.setScene(scene);
primaryStage.show();
}
}
Application
これについて、サブクラスは実行中のアプリケーション全体を表すと考えています。したがって、JVM ごとに 1 回だけそのようなクラスをインスタンス化することが理にかなっているため、これらは本質的に再利用可能ではないと考える必要があります。再利用したいコードを別のクラスに移動します。