2015-11-23 42 views
3

我想創建一個使用JavaFX作爲UI框架的客戶端應用程序,並與Spring集成以利用現代UI,依賴注入,AOP和豐富的REST API。在我的JavaFX Applicationinit()方法中,創建了一個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")); 
    } 

} 

回答

2

現在我認識到大多數的init()方法需要的JavaFX應用程序線程。

這個假設是錯誤的,您可以從JavaFX應用程序線程初始化節點。

您不能在活動場景圖中修改JavaFX應用程序線程中的節點。但是,一旦調用了應用程序的start()方法,只有在init()方法完成後纔會發生活動的場景圖。閱讀JavaFX Application javadoc以獲取更多信息。

在應用程序的init()方法中,沒有活動的場景圖,並且無論您使用哪個線程上的節點執行操作都無關緊要,只要所有工作都是不違反任何JavaFX線程規則在場景附加到start()方法中提供的階段之前完成。

我知道這條規則(對於JavaFX 8)唯一的例外是WebView,它必須僅由FX線程創建和訪問。

所以,我沒有回答你原來的問題,但也許它不需要回答。

相關問題