2016-09-02 66 views
2

我有一個SimpleIntegerProperty,並且想從中推導SimpleObjectProperty<Color>
對於我想象像流和自選一些機制:如何映射JavaFX observables的值?

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

有什麼內置已經或者我真的需要推出這一我自己?
如果沒有這樣的東西,看起來很奇怪,因爲看着Bindings的所有力量都會給你強烈的感覺,即這個特徵也應該在那裏。

謝謝!

回答

2

不能確定這是否是最好的方式,但是這似乎用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

維姆的回答是,如果你只想使用標準JavaFX庫做到這一點的最好辦法。如果你很高興到第三方庫添加到項目中,托馬斯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) { 
    // ... 
} 
+0

我還挺喜歡這個,但是這個庫似乎並不「生產準備好「,我也沒有看到任何最近的項目提交,所以我們在這裏肯定沒有什麼可以使用:(。 – Chris

+0

歷史是他從另一個項目[EasyBind](https:/ /github.com/TomasMikula/EasyBind)嵌入到他的反應性事件流實現中。EasyBind最初是作爲[JavaFX功能請求]的概念驗證書編寫的(https://bugs.openjdk.java.net/browse/JDK -8091544)雖然這個功能請求仍然是針對JDK9的,但它目前還沒有解決,所以我懷疑它會在那裏,所以,我會幫你r點。當然,源代碼是全部可用的,所以如果你足夠喜歡它,你可以將基本部分滾動到你自己的實現:)。 –