如何动态初始化JavaFX应用程序,而不是硬编码?

如何动态初始化JavaFX应用程序,而不是硬编码?,java,spring,javafx,Java,Spring,Javafx,在许多示例中,我们展示了如何扩展应用程序方法来编写和运行JavaFX应用程序 但是如果我不想呢?如果我想从代码中动态配置应用程序,该怎么办?示例如下: import javafx.application.Application; import javafx.stage.Stage; public class HollowTry { public static class HollowApplication extends Application { @Override

在许多示例中,我们展示了如何扩展
应用程序
方法来编写和运行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()
访问的配置类:

公共类SpringJavaFX扩展应用程序{
私有静态类[]注释类;
@凌驾
public void start(Stage primaryStage)引发异常{
AnnotationConfigApplicationContext上下文=新的AnnotationConfigApplicationContext(AnnotatedClass);
String title=(String)context.getBean(“PrimaryStageTle”);
初级阶段。设置标题(标题);
Scene-Scene=(Scene)context.getBean(“primaryStageScene”);
初级阶段。场景(场景);
primaryStage.show();
}
公共静态无效启动(类…注释类){
SpringJavaFX.annotatedClasses=annotatedClasses;
Application.launch();
}
}
春路大厦

这里是SpringWay建筑的一个例子。每个组件都是一个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);
   }

}
public类尝试01\u HelloWorld{
@配置
公共静态类配置{
@豆子
字符串primaryStageTle(){
返回“Attempt01\u HelloWorld”;
}
@豆子
场景初始阶段(){
场景ans=新场景(根(),800600);
返回ans;
}
@豆子
按钮(){
按钮ans=新按钮();
ans.setText(“说‘你好,世界’”);
ans.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
System.out.println(“你好,世界!”);
}
});
root().getChildren().add(ans);
返回ans;
}
@豆子
StackPane根目录(){
StackPane root=新的StackPane();
返回根;
}
}
公共静态void main(字符串[]args){
SpringJavaFX.launch(Config.class);
}
}

我不确定它是否有效,但您可以尝试在内部类中为应用程序的参数添加setter方法,并尝试从外部调用它们(例如从主类)。同样,我不知道这是否有效,但我会在您的位置尝试一下。

我不确定它是否有效,但您可以尝试在内部类中为应用程序的参数添加setter方法,并尝试从外部调用它们(例如从主类)。同样,我不知道这是否有效,但我会在您的位置尝试一下。

正确的方法是在start方法中配置应用程序。在应用程序终止之前,Launch()不会返回。添加到@AndreasFester注释:在应用程序退出之前,启动方法不会返回,无论是通过调用Platform.exit还是关闭所有应用程序窗口。-所以在
Application.launch(HollowApplication.class,args)之后的任何内容
在应用程序退出后才会运行。也可以使用
init
方法。调用
init
时(或更高版本),可以使用与main方法中完全相同的信息(
getParameters()
方法)。如果突出显示要动态设置的内容,则可能会有帮助。您是否只想设置视图,如窗口宽度和高度?或者,您还希望什么是动态的?正确的方法是在start方法中配置应用程序。在应用程序终止之前,Launch()不会返回。添加到@AndreasFester注释:在应用程序退出之前,启动方法不会返回,无论是通过调用Platform.exit还是关闭所有应用程序窗口。-所以在
Application.launch(HollowApplication.class,args)之后的任何内容
在应用程序退出后才会运行。也可以使用
init
方法。调用
init
时(或更高版本),可以使用与main方法中完全相同的信息(
getParameters()
方法)。如果突出显示要动态设置的内容,则可能会有帮助。您是否只想设置视图,如窗口宽度和高度?或者你还想做些什么?
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);
   }

}