欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mvvmFX:使用JavaFX的Model-View-ViewModel

程序员文章站 2024-02-05 23:29:28
...

设计模式“ Model-View-ViewModel”最初是由Microsoft发布的,用于.Net应用程序,如今也用于其他技术,例如JavaScript框架。

与其他MV *方法一样,目标是将用户界面的结构与(UI-)逻辑分开。 为此,MVVM定义了一个表示UI状态的ViewModel ViewModel不知道View ,并且不依赖于特定的UI组件。 mvvmFX:使用JavaFX的Model-View-ViewModel

相反, 视图包含UI组件,但不包含UI逻辑,并通过Data-BindingViewModel连接。

一个简单的示例是在ViewModel中准备欢迎消息:

mvvmFX:使用JavaFX的Model-View-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的生命周期。

mvvmFX:使用JavaFX的Model-View-ViewModel所示示例使用FXML定义用户界面的结构。 这是推荐的开发方式,但是mvvmFX也支持用纯Java代码编写的传统View。

该库的另一个关键方面是对依赖注入框架的支持。

这对于在更大的项目中使用该库至关重要。

目前,提供了用于与Google GuiceJBoss 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