mvvmFX:在运行时更改场景的一部分

时间:2018-02-20 19:45:28

标签: javafx mvvm mvvmfx

我正在使用mvvmFX构建JavaFX应用程序。

我有一个有两个窗格的场景。两个窗格都应包含any.fxml。我想在运行时更改包含的窗格。

picture

所以我找到了这个解决方案: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);
    }    
}

1 个答案:

答案 0 :(得分:0)

initialize的示例代码中,您正在使用FXMLLoader,它是标准JavaFX的一部分。但是,要使用所有设置逻辑加载mvvmFX视图,您必须使用mvvmFX的FluentViewLoaderFluentViewLoader在内部使用FXMLLoader,但会执行更多操作,例如将ViewModel注入其视图中。

所以你的代码应该是这样的:

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

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