如何让Spring在初始化Node bean时使用JavaFX Application Thread?

时间:2015-11-23 07:06:38

标签: java spring javafx

我正在尝试使用JavaFX作为UI框架创建客户端应用程序,与Spring集成以利用现代UI,依赖注入,AOP和丰富的REST API。在我的JavaFX public override void OnActionExecuting(HttpActionContext actionContext) { if (!actionContext.ModelState.IsValid) { var errors = new List<string>(); foreach (var state in actionContext.ModelState) { foreach (var error in state.Value.Errors) { errors.Add(error.ErrorMessage); } } actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, errors); } } 的{​​{1}}方法中,创建init()以自动加载Application所需的SpringApplication个bean。这些Node bean使用Scene注释进行注释,并使用带有Node注释的@Component方法进行注释以进行初始化,并在构建后设计每个节点。现在我意识到大多数这些init()方法都需要@PostConstruct。我如何强制Spring在初始化这些节点时使用init()?我可能需要在这里重构我的代码。

示例代码

JavaFX Application Thread

1 个答案:

答案 0 :(得分:2)

  

现在我意识到大多数这些init()方法都需要JavaFX Application Thread。

这个假设是错误的,您可以从JavaFX应用程序线程初始化节点。

您无法修改JavaFX应用程序线程中活动场景图中的节点。但是,一旦调用了Application start()方法,您就只有一个活动的场景图,直到init()方法完成后才会发生这种情况。阅读JavaFX Application javadoc以获取更多信息。

在Application init()方法中,没有活动的场景图,无论你在任何线程上使用节点做什么都没关系,只要所有的工作都不违反任何JavaFX线程规则在场景附加到start()方法中提供的舞台之前完成。

我对此规则(对于JavaFX 8)所知道的唯一例外是WebView,必须仅从FX线程创建和访问它。

所以,我没有回答你原来的问题,但也许不需要回答。