我想創建一個使用JavaFX作爲UI框架的客戶端應用程序,並與Spring集成以利用現代UI,依賴注入,AOP和豐富的REST API。在我的JavaFX Application
的init()
方法中,創建了一個SpringApplication
以自動爲Scene
所需的Node
豆類。這些Node
豆注有@Component
註釋,還有init()
方法用@PostConstruct
註釋進行初始化,並在設計完成後設計每個節點。現在我意識到這些方法中的大多數都需要JavaFX Application Thread
。我怎麼能強制Spring在初始化這些節點時使用JavaFX Application Thread
?我可能需要在這裏重構我的代碼。如何讓Spring在初始化Node Bean時使用JavaFX Application Thread?
示例代碼
@Configuration
@EnableAsync
@EnableScheduling
@EnableCaching
// Component scanning for JavaFX Nodes
@ComponentScan("path.to.view.nodes")
public class MyConfiguration {
// bean definitiions here
}
public class MyApplication extends Application {
private ConfigurableApplicationContext configurableApplicationContext;
@Autowired
private RootPane rootPane;
@Override
public void init() throws Exception {
SpringApplication application;
application = new SpringApplication();
application.getSources().add(MyConfiguration.class);
application.setWebEnvironment(false);
application.setShowBanner(false);
application.setRegisterShutdownHook(true);
configurableApplicationContext = application.run();
ConfigurableListableBeanFactory beanFactory;
beanFactory = configurableApplicationContext.getBeanFactory();
beanFactory.registerSingleton(getClass().getSimpleName(), this);
beanFactory.autowireBean(this);
}
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setScene(new Scene(rootPane));
primaryStage.centerOnScreen();
primaryStage.show();
}
@Override
public void stop() throws Exception {
configurableApplicationContext.close();
}
public static void main(String... args) {
Application.launch(MyApplication.class, args);
}
}
@Component
public class RootPane extends BorderPane {
@PostConstruct
public void init() {
setRight(new Button("Click me"));
}
}