mvvmFX:在运行时更改场景的一部分
mvvmFX: Changing Part of a Scene on Runtime
我正在使用 mvvmFX.
构建 JavaFX 应用程序
我有一个有两个窗格的场景。两个窗格都应包含 any.fxml 。我想在运行时更改包含的窗格。
所以我找到了这个解决方案: 并尝试应用它。
到目前为止,还不错。 Pane2 正在显示 any.fxml
,但不幸的是,controller/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>
这是视图模型/控制器
@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);
}
}
在 initialize
的示例代码中,您使用的是 FXMLLoader
,它是标准 JavaFX 的一部分。但是,要加载包含所有设置逻辑的 mvvmFX 视图,您必须使用 mvvmFX 的 FluentViewLoader
。
FluentViewLoader
在内部使用 FXMLLoader
但做了更多的操作,比如将 ViewModels 注入到它们的视图中。
因此您的代码应如下所示:
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
ViewTuple<AnyView, AnyViewModel> viewTuple = FluentViewLoader.fxmlView(AnyView.class).load();
pane2.setCenter(viewTuple.getView());
}
我正在使用 mvvmFX.
构建 JavaFX 应用程序我有一个有两个窗格的场景。两个窗格都应包含 any.fxml 。我想在运行时更改包含的窗格。
所以我找到了这个解决方案:
到目前为止,还不错。 Pane2 正在显示 any.fxml
,但不幸的是,controller/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>
这是视图模型/控制器
@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);
}
}
在 initialize
的示例代码中,您使用的是 FXMLLoader
,它是标准 JavaFX 的一部分。但是,要加载包含所有设置逻辑的 mvvmFX 视图,您必须使用 mvvmFX 的 FluentViewLoader
。
FluentViewLoader
在内部使用 FXMLLoader
但做了更多的操作,比如将 ViewModels 注入到它们的视图中。
因此您的代码应如下所示:
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
ViewTuple<AnyView, AnyViewModel> viewTuple = FluentViewLoader.fxmlView(AnyView.class).load();
pane2.setCenter(viewTuple.getView());
}