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

时间:2016-04-23 06:10:59

标签: java spring javafx

在许多示例中,展示了如何扩展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);
   }

}

1 个答案:

答案 0 :(得分:0)

我不确定它是否可行,但您可以尝试在内部类中为应用程序的参数添加setter方法,并尝试从外部(例如从您的主要部分)调用它们。再说一遍,我不知道这是否有效,但我会试着替你试试。