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 的 FluentViewLoaderFluentViewLoader 在内部使用 FXMLLoader 但做了更多的操作,比如将 ViewModels 注入到它们的视图中。

因此您的代码应如下所示:

@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
    ViewTuple<AnyView, AnyViewModel> viewTuple = FluentViewLoader.fxmlView(AnyView.class).load();

    pane2.setCenter(viewTuple.getView());  
}