【发布时间】:2023-03-16 05:05:01
【问题描述】:
在许多示例中,展示了如何扩展 Application 方法以组合和运行 JavaFX 应用程序。
但是如果我不想呢?如果我想从我的代码动态配置应用程序怎么办?示例如下:
import javafx.application.Application;
import javafx.stage.Stage;
public class HollowTry {
public static class HollowApplication extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
}
}
public static void main(String[] args) {
Application.launch(HollowApplication.class, args);
// now I want to set title, scene etc... how?
}
}
请不要争论我为什么需要它。
更新
好的,launch() 永远不会被终止,我没有检查这个。无论如何,我需要有一种方法以编程方式构建应用程序,而无需任何硬编码。
更新 2
我希望从 Spring 构建应用程序,我现在找到了以下解决方案。
JavaFX 包装类
它将上下文初始化包装到 FX 线程中,并捕获可从 start() 访问的配置类:
public class SpringJavaFX extends Application {
private static Class<?>[] annotatedClasses;
@Override
public void start(Stage primaryStage) throws Exception {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(annotatedClasses);
String title = (String) context.getBean("primaryStageTitle");
primaryStage.setTitle(title);
Scene scene = (Scene) context.getBean("primaryStageScene");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void launch(Class<?>... annotatedClasses) {
SpringJavaFX.annotatedClasses = annotatedClasses;
Application.launch();
}
}
春天的方式建设
这是一个弹簧式建筑的例子。每个组件都是一个 bean 并就地创建:
public class Attempt01_HelloWorld {
@Configuration
public static class Config {
@Bean
String primaryStageTitle() {
return "Attempt01_HelloWorld";
}
@Bean
Scene primaryStageScene() {
Scene ans = new Scene(root(), 800, 600);
return ans;
}
@Bean
Button button() {
Button ans = new Button();
ans.setText("Say 'Hello World'");
ans.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
root().getChildren().add(ans);
return ans;
}
@Bean
StackPane root() {
StackPane root = new StackPane();
return root;
}
}
public static void main(String[] args) {
SpringJavaFX.launch(Config.class);
}
}
【问题讨论】:
-
正确的做法是在启动方法中配置应用程序。在应用程序终止之前,Launch() 不会返回。
-
添加到@AndreasFester 评论:在应用程序退出之前,启动方法不会返回,无论是通过调用 Platform.exit 还是所有应用程序窗口都已关闭。 - 所以
Application.launch(HollowApplication.class, args);之后的任何东西在应用程序退出之前都不会运行。 -
init方法也是一种可能。当init被调用(或以后)时,与主方法完全相同的信息可用(getParameters()方法)。 -
我认为如果您突出显示您想要动态设置的内容会很有帮助。您是否只想设置视图,例如窗口宽度和高度?或者你还想要什么动态的?