【问题标题】:How to initialize JavaFX application dynamically, not hardcoded?如何动态初始化 JavaFX 应用程序,而不是硬编码?
【发布时间】: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() 方法)。
  • 我认为如果您突出显示您想要动态设置的内容会很有帮助。您是否只想设置视图,例如窗口宽度和高度?或者你还想要什么动态的?

标签: java spring javafx


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-17
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    相关资源
    最近更新 更多