如何映射JavaFX可观察量的值?

时间:2016-09-02 07:32:15

标签: java javafx javafx-8

我有SimpleIntegerProperty并希望从中获取SimpleObjectProperty<Color>。 为此我想象一些像溪流和选择的机制:

SimpleIntegerProperty intProp;
ObjectProperty<Color> colorProp = intProp.map(i -> convertIntToColor(i), c -> convertColorToInt(c));

是否已经内置了某些东西,或者我真的需要自己推出这个内容吗?
如果没有这样的事情似乎很奇怪,因为看Bindings的所有力量会让你强烈感觉到这个特征也应该存在。

谢谢!

2 个答案:

答案 0 :(得分:4)

不确定这是否是最佳方式,但这似乎可以使用Bindings.createObjectBinding

@Test
    public void test() {
        SimpleIntegerProperty simpleIntegerProperty = new SimpleIntegerProperty(1);
        ObjectBinding<Color> binding = Bindings
                .createObjectBinding(() -> converToColor(simpleIntegerProperty.get()), simpleIntegerProperty);
        System.out.println(binding.get());
        binding.addListener(new ChangeListener<Color>() {
            @Override
            public void changed(ObservableValue<? extends Color> observable, Color oldValue, Color newValue) {
                System.out.println(newValue);
            }
        });
        simpleIntegerProperty.set(2);
    }

    private Color converToColor(int i) {
        switch (i) {
            case 1:
                return Color.RED;
            case 2:
                return Color.BLUE;
        }
        return null;
    }

答案 1 :(得分:1)

如果您只想使用标准JavaFX库,Wim的答案是最好的方法。如果您乐意将第三方库添加到项目中,Tomas Mikula的ReactFX(版本2.0或更高版本)提供了开箱即用的功能:

IntegerProperty rgba = new SimpleIntegerProperty();
Property<Color> color = Var.mapBidirectional(rgba.asObject(),
    this::convertIntToColor, this::convertColorToInt);

// ...

private Color convertIntToColor(Integer rgba) {
    // ...
}

private Integer convertColorToInt(Color c) {
    // ...
}