您可以通过在 Application 子类之一的新实例上直接调用 start(...) 来完成这项工作,但这有点像 hack,并且与start(...) 方法的预期用途。 (只是在语义上:一个名为 Application 的类中的一个名为 start 的方法应该在您的应用程序启动时执行,而不是在它已经运行后的某个任意时间点执行。)
您真的应该将start 方法视为传统Java 应用程序中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 只实例化一次这样的类才有意义,因此您应该认为这些本质上是不可重用的。将您想要重用的任何代码移动到某个不同的类中。