使用JavaFX构建反应系统

反应 JavaFX是用于在Java中构建图形应用程序的新标准库,但是许多程序员仍然对Swing甚至(高音)AWT感到困惑。 在Java诞生20年来,发生了很多事情。 两年前,当我开始研究Speedment UI的JavaFX库时发现很多东西很着迷! 这里有一些技巧,说明如何使用JavaFX工具包中的许多令人敬畏的新功能来构建反应Swift的应用程序!

1.财产价值

如果您窥探了JavaFX组件,那么您一定遇到过“属性”一词。 几乎可以观察到FX库中的每个值,分隔线的宽度,图像的大小,标签中的文本,列表的子级以及复选框的状态。 属性分为两类: 可写和可读。 可以使用设置器或直接修改属性来更改可写值。 JavaFX将处理事件处理,并确保将通知依赖该属性的每个组件。 可读值具有使您可以在值更改时接收通知的方法。

例:
// Read- and writable
StringProperty name = new SimpleStringProperty("Emil"); 
// Only readable
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

有时,您会发现需要创建绑定时组件中没有确切的值。 一个典型的例子是您拥有一个StringProperty ,它具有从TextField获得的路径。 如果您希望此值表示为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.表达

使用前面显示的Bindings-class可以创建各种表达式。 假设您有两个文本字段,用户可以在其中输入信息。 现在,您需要定义一个只读字段,该字段始终包含一个字符串,如果两个字符串的长度相等,则表示两个字符之间的字符混合。 如果长度不相等,则应显示一条帮助消息。

例:
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众多功能中的少数。 希望您能找到更多利用事件系统的创新方法!

翻译自: https://www.javacodegeeks.com/2016/02/building-reactive-systems-javafx.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值