我正在使用mvvmFX构建JavaFX应用程序。
我有一个有两个窗格的场景。两个窗格都应包含any.fxml。我想在运行时更改包含的窗格。
所以我找到了这个解决方案:JavaFX/SceneBuilder - Changing only PART of a Scene并尝试应用它。
到目前为止,这么好。 Pane2正在显示any.fxml
,但遗憾的是,控制器/ viewModel未加载。至少看起来如此,any.fxml
包含一个应该由viewModel修改的标签。
如果O将fx:controller="anyVM"
添加到any.fxml
并在fx:include source="any.fxml"
中通过pane2.fxml
添加,则一切正常。但是对我来说,在运行时更改它很重要。
如果有人知道如何实现这一点,我会很高兴。
这是我的主场景:
public class Scene implements FxmlView<SceneVM>, Initializable {
@FXML
private BorderPane pane2;
@InjectViewModel
private SceneVM sceneVM;
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
FXMLLoader loader = new FXMLLoader(getClass().getResource("any.fxml"));
loader.setController(anyVM.class);
try {
pane2.setCenter(loader.load());
} catch (IOException e) {
e.printStackTrace();
}
}
}
这是scene.fxml中的pane2:
<BorderPane fx:id="pane2" layoutX="846.0" prefHeight="547.0" prefWidth="521.0">
<center> <!--<fx:include source="any.fxml" />-->
</center>
</BorderPane>
这是ViewModel / Controller
@Singleton
public class anyVM implements ViewModel {
private StringProperty lbl = new SimpleStringProperty("27");
public StringProperty getLbl(){
return basementViewKesselTempLbl;
}
public void setLbl(String message){
lbl.set(message);
}
}
答案 0 :(得分:0)
在initialize
的示例代码中,您正在使用FXMLLoader
,它是标准JavaFX的一部分。但是,要使用所有设置逻辑加载mvvmFX视图,您必须使用mvvmFX的FluentViewLoader
。
FluentViewLoader
在内部使用FXMLLoader
,但会执行更多操作,例如将ViewModel注入其视图中。
所以你的代码应该是这样的:
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
ViewTuple<AnyView, AnyViewModel> viewTuple = FluentViewLoader.fxmlView(AnyView.class).load();
pane2.setCenter(viewTuple.getView());
}