我已經通過了很多關於將Spring DI與JavaFx集成的教程,但是我碰到了一個簡單示例不包含的牆(我無法弄清楚)。JavaFX fxml - 如何使用嵌套自定義控件的Spring DI?
我想在視圖和表示層之間進行乾淨的分離。我想使用fxml來定義可組合的視圖,並使用Spring將它們連接在一起。這裏有一個具體的例子:
Dashboard.fxml:
<GridPane fx:id="view"
fx:controller="com.scrub.presenters.DashboardPresenter"
xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml">
<children>
<TransactionHistoryPresenter fx:id="transactionHistory" />
</children>
</GridPane>
Main.java:
public void start(Stage primaryStage) throws Exception{
try {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppFactory.class);
SpringFxmlLoader loader = context.getBean(SpringFxmlLoader.class);
primaryStage.setScene(new Scene((Parent)loader.load("/views/dashboard.fxml")));
primaryStage.setTitle("Hello World");
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
SpringFxmlLoader.java:
public class SpringFxmlLoader {
@Autowired
ApplicationContext context;
public Object load(String url) {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource(url));
loader.setControllerFactory(new Callback<Class<?>, Object>() {
@Override
public Object call(Class<?> aClass) {
return context.getBean(aClass);
}
});
return loader.load();
} catch(Exception e) {
e.printStackTrace();
throw new RuntimeException(String.format("Failed to load FXML file '%s'", url));
}
}
}
所以當DashboardPresenter被加載的SpringFxmlLoader正確地注入控制器w使用loader.setControllerFactory。
但是,自定義TransactionHistoryPresenter控件加載了新實例,而不是從spring上下文中加載。它必須使用它自己的FXMLLoader?
任何想法如何使自定義控件與春天很好玩?我真的不想讓控制器/演示者手動將它們連接起來。
不知道(至少有一些)您的TransactionHistoryPresenter類。通常我會想到JavaFX將「控制器」稱爲演示者。如果你使用''來加載fxml,並讓主持人與之關聯,那麼控制器工廠將傳播到'',並且演示者變成一個Spring管理的bean。 –
2015-03-02 07:01:37