mvvmFX:使用JavaFX的Model-View-ViewModel
设计模式“ Model-View-ViewModel”最初是由Microsoft发布的,用于.Net应用程序,如今也用于其他技术,例如JavaScript框架。
与其他MV *方法一样,目标是将用户界面的结构与(UI-)逻辑分开。 为此,MVVM定义了一个表示UI状态的ViewModel 。 ViewModel不知道View ,并且不依赖于特定的UI组件。
相反, 视图包含UI组件,但不包含UI逻辑,并通过Data-Binding与ViewModel连接。
一个简单的示例是在ViewModel中准备欢迎消息:
这种结构的好处之一是,所有UI状态和UI逻辑都封装在独立于UI的ViewModel中。
但是,UI逻辑是什么? UI逻辑定义用户界面对用户输入或其他事件(例如域模型中的更改)的反应。 例如,确定按钮是处于活动状态还是非活动状态。
由于与UI的独立性,因此可以使用单元测试来测试ViewModel 。
在许多情况下,在实际应用由测试工具启动和远程控制的情况下,不再需要进行复杂的集成测试。 这大大简化了测试驱动的开发。
由于属性和数据绑定的可用性,JavaFX非常适合这种设计模式。 mvvmFX添加了帮助程序和工具,以高效,干净地实施该模式。
以下示例将给人以MVVM开发过程的印象。
在该示例中,只有在输入用户名和密码后才可以单击登录按钮。
在TDD之后,第一步是为ViewModel创建一个单元测试:
@Test
public void test(){
LoginViewModel viewModel = new LoginViewModel();
assertThat(viewModel.isLoginButtonDisabled()).isFalse();
viewModel.setUsername("mustermann");
assertThat(viewModel.isLoginButtonDisabled()).isFalse();
viewModel.setPassword("geheim1234");
assertThat(viewModel.isLoginPossible()).isTrue();
}
After that the <i>ViewModel</i> can be implemented:
public class LoginViewModel implements ViewModel {
private StringProperty username = new SimpleStringProperty();
private StringProperty password = new SimpleStringProperty();
private BooleanProperty loginPossible = new SimpleBooleanProperty();
public LoginViewModel() {
loginButtonDisabled.bind(username.isEmpty().or(password.isEmpty());
}
// getter/setter
}
现在,此ViewModel必须与View连接。 在mvvmFX的上下文中,“视图”是fxml文件和相关控制器类的组合。 请记住,JavaFX控制器是视图的一部分,并且不应包含任何逻辑,这一点很重要。
它的唯一目的是创建与ViewModel的连接。
public class LoginView implements FxmlView<LoginViewModel> {
@FXML
public Button loginButton;
@FXML
public TextField username;
@FXML
public PasswordField password;
@InjectViewModel //is provided by mvvmFX
private LoginViewModel viewModel;
//will be called by JavaFX as soon as the FXML bootstrapping is done
public void initialize(){
username.textProperty()
.bindBidirectional(viewModel.usernameProperty());
password.textProperty()
.bindBidirectional(viewModel.passwordProperty());
loginButton.disableProperty()
.bindBidirectional(viewModel.loginPossibleProperty());
}
}
请注意,View具有一个通用类型,它是相关的ViewModel类型。 这样, mvvmFX可以管理View和ViewModel的生命周期。
所示示例使用FXML定义用户界面的结构。 这是推荐的开发方式,但是mvvmFX也支持用纯Java代码编写的传统View。
该库的另一个关键方面是对依赖注入框架的支持。
这对于在更大的项目中使用该库至关重要。
目前,提供了用于与Google Guice和JBoss Weld / CDI集成的其他模块,以使这些框架易于入门。 但是其他DI框架也可以轻松嵌入。
mvvmFX最近在第一个稳定版本1.0.0中发布。 它由Saxonia-Systems AG用于项目。 该框架是作为开放源代码(Apache许可)开发的,并托管在Github上 。 作者期待获得反馈,建议和重要评论。
对于将来的开发,重点放在具有复杂用户界面的大型项目所需的功能上。 这些机制包括许多ViewModels可以访问公共数据而无需引入相互可见性和彼此依赖的机制(范围)。
此外,还有一些助手来实现视图之间的导航和主从界面的管理。 灵感的来源之一是Microsoft的框架PRISM,这是一个应用程序框架,为开发应用程序提供了许多必需的工具。
翻译自: https://jaxenter.com/mvvmfx-model-view-viewmodel-javafx-114907.html
上一篇: MySQL常用语句笔记
下一篇: 国外CMS系统介绍(总结)