利用JavaFX工具构建Reactive系统

 更新时间:2016年02月29日 15:08:58   作者:leoxu  
这篇文章主要介绍了使用JavaFX构建Reactive系统,利用JavaFX工具集中的新的超棒特性来构建响应式的快速应用程序,感兴趣的小伙伴们可以参考一下

JavaFX 是Java中用来构建图形应用程序的新的标准库, 但许多程序员仍然坚持在使用Swing甚至AWT。关于如何利用JavaFX工具集中的新的超棒特性来构建响应式的快速应用程序,这里有一些建议!

1. 属性值

如果你对JavaFX组件做过完整的了解,移动遇到过属性(Property)这个东西。FX库中几乎每个值都可以被观察,分区(divider)的宽度,图片的尺寸,文本标识(label)中的文字,一个列表中的子项以及复选框(checkbox)的状态。属性分成另类:可写属性和可读属性。可写值可以被修改,使用设置器方法或者直接修改。 JavaFX 会处理事件处置过程并确保每个依赖于此属性的组件都会被通知到。可读属性拥有能让你在其值被修改时接收到通知的方法。

示例:

// 可读-且可写
StringProperty name = new SimpleStringProperty("Emil"); 
// 只读
ObservableBooleanValue nameIsEmpty = name.isEmpty();

2. 绑定值

当你拥有一个可写和可读值的时候,你可以开始就这些值如何关联定义规则。一个可写属性可以被绑定到一个可读属性,如此其值总是会匹配到可读的这个。绑定并不会立即发生,不过它们会在值被观察之前进行(看看我在那里做的就明白了)。 绑定可以是单向或者双向的。当然,如果它们之间是双向的,就需要两个属性都是可写的。

示例:

TextField fieldA = new TextField();
TextField fieldB = new TextField();
fieldA.prefWidthProperty().bind(fieldB.widthProperty());

3. 可观察的列表

属性并不是唯一可以被观察的东西。如果列表是被封装到了一个 ObservableList 中,那么列表的成员同样也是可以被观察到的。ObservableList 的响应模型是相当先进的。你不仅能在列表被修改时收到通知,也可以看到列表具体是如何被修改的。

示例:

List<String> otherList = Arrays.asList("foo", "bar", "bar");
ObservableList<String> list = FXCollections.observableList(otherList);

list.addListener((ListChangeListener.Change<? extends String> change) -> {
  System.out.println("Received event.");
  while (change.next()) {
    if (change.wasAdded()) {
      System.out.println(
        "Items " + change.getAddedSubList() + " was added.");
    }

    if (change.wasRemoved()) {
      System.out.println(
        "Items " + change.getRemoved() + " was removed.");
    }
  }
});

System.out.println("Old list: " + list);
list.set(1, "foo");
System.out.println("New list: " + list);

上面代码的运行输出如下:

Old list: [foo, bar, bar]
Received event.
Items [foo] was added.
Items [bar] was removed.
New list: [foo, foo, bar]

如你所见,设置操作只会触发一次事件。

4. StringConverter
有时你会发现自己要创建一个绑定时无需去提取一个组件中的值。 这个的典型示例就是你有了一个从一个文本域(TextField)获取到的带有path 的 StringProperty。如果你想要有一个带有表示为Path的这个值的可观察属性,就需要去为它创建一个StringConverter。
示例:

TextField fileLocation = new TextField();
StringProperty location = fileLocation.textProperty();
Property<Path> path = new SimpleObjectProperty<>();
 
Bindings.bindBidirectional(location, path, new StringConverter<Path>() {
  @Override
  public String toString(Path path) {
    return path.toString();
  }
 
  @Override
  public Path fromString(String string) {
    return Paths.get(string);
  }
});

对象属性并不是跟文本域的值进行的双向绑定。

5. Expressions

使用上述的 Bindings类,你可以创建出任何类型的表达式。比如说你有了两个可以让用户输入信息的文本域。现在想要定义一个只读域,其中总是会包含一个字符串,如果两个串的长度相等,将会是两个串逐个字符间隔混在一起进行显示。如果长度不等,则显示一条帮助信息。
示例:

TextField first = new TextField();
TextField second = new TextField();
TextField mix  = new TextField();
 
mix.textProperty().bind(
  Bindings.when(
    first.lengthProperty().isEqualTo(second.lengthProperty())
  ).then(Bindings.createStringBinding(
    () -> {
      int length    = first.lengthProperty().get();
      String firstText = first.textProperty().get();
      String secondText = second.textProperty().get();
      char[] result   = new char[length * 2];
 
      for (int i = 0; i < length; i++) {
        result[i * 2]   = firstText.charAt(i);
        result[i * 2 + 1] = secondText.charAt(i);
      }
 
      return new String(result);
    }, 
    first.textProperty(),
    second.textProperty()
  )).otherwise("Please enter two strings of exactly the same length.")
);

这里只是JavaFX诸多特性的其中一点点。希望你可以找到更多利用这个事件系统的创造性方式!

相关文章

  • Java实现简单的分页功能

    Java实现简单的分页功能

    这篇文章主要为大家详细介绍了Java实现简单的分页功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • JAVA中读取文件(二进制,字符)内容的几种方法总结

    JAVA中读取文件(二进制,字符)内容的几种方法总结

    本篇文章主要介绍了JAVA中读取文件(二进制,字符)内容的方法总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • mybatis查询数据赋值到model里面为空的解决

    mybatis查询数据赋值到model里面为空的解决

    这篇文章主要介绍了mybatis查询数据赋值到model里面为空的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • java 读取网页内容的实例详解

    java 读取网页内容的实例详解

    这篇文章主要介绍了java 读取网页内容的实例详解的相关资料,希望通过本文能帮助到大家,让大家学习理解这部分内容,需要的朋友可以参考下
    2017-09-09
  • Spring Boot指定外部配置文件简单示例

    Spring Boot指定外部配置文件简单示例

    Spring Boot可以让你将配置外部化,这样你就可以在不同的环境中使用相同的应用程序代码,这篇文章主要给大家介绍了关于Spring Boot指定外部配置文件的相关资料,需要的朋友可以参考下
    2024-01-01
  • SpringBoot 模板模式实现优惠券逻辑的示例代码

    SpringBoot 模板模式实现优惠券逻辑的示例代码

    这篇文章主要介绍了SpringBoot 模板模式实现优惠券逻辑,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • java实现两个对象之间传值及简单的封装

    java实现两个对象之间传值及简单的封装

    这篇文章主要介绍了java实现两个对象之间传值及简单的封装,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java中hashMap遍历的9种方式

    Java中hashMap遍历的9种方式

    hashMap是非常重要的容器类,本文主要介绍了Java中hashMap遍历的9种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • Java线程阻塞的方法区别详解

    Java线程阻塞的方法区别详解

    这篇文章主要介绍了Java线程阻塞的方法区别详解,线程阻塞是指当一个线程无法继续执行时,它会进入阻塞状态,直到某个条件满足后才能继续执行,线程阻塞可以通过多种方式实现,如等待锁、等待IO操作、等待其他线程的完成等,需要的朋友可以参考下
    2023-10-10
  • java中ExecutorService创建方法总结

    java中ExecutorService创建方法总结

    在本篇文章里小编给大家整理了一篇关于java中ExecutorService创建方法总结,有兴趣的朋友们可以参考下。
    2021-01-01

最新评论