2015-04-06 2 views
0

Рассмотрим следующие модели, AppleКак обновить JavaFX привязки ссылки объекта Обзор

public class Apple { 
    private StringProperty appleName = new SimpleStringProperty("Apple"); 

    public String getAppleName() { 
     return appleName.get(); 
    } 

    public StringProperty appleNameProperty() { 
     return appleName; 
    } 

    public void setAppleName(String appleName) { 
     this.appleName.set(appleName); 
    } 
} 

и корзины

public class Basket { 
    private Apple apple = new Apple(); 

    public Apple getApple() { 
     return apple; 
    } 

    public void setApple(Apple apple) { 
     this.apple = apple; 
    } 
} 

Корзина имеет яблоко. Теперь я пытаюсь связать простое свойство строки, как показано ниже.

public class Food{ 

    public static void main(String[] args) { 
     StringProperty localApple = new SimpleStringProperty("lGreenApple"); 
     Basket basket = new Basket(); 
     Apple rGreenApple = new Apple(); 
     rGreenApple.setAppleName("rGreenApple"); 
     basket.setApple(rGreenApple); 
     Bindings.bindBidirectional(localApple, rGreenApple.appleNameProperty()); 
     rGreenApple.appleNameProperty().set("rGreenApple 2"); 
     System.out.println(localApple.getValue()); //rGreenApple 2 

     Apple redApple = new Apple(); 
     redApple.setAppleName("rRedApple"); 
     basket.setApple(redApple); 
     redApple.appleNameProperty().set("rRedApple 2"); 
     System.out.println(localApple.getValue());//Still rGreenApple 2 
    } 
} 

При попытке получить значение после связывания, по-прежнему localApple объект имеет ссылку на rGreenApple. Каков чистый способ получить красное яблоко?

ответ

1

Вам нужно две вещи:

  1. Сделать apple недвижимость в Basket JavaFX Наблюдаемое свойство, вместо обычного имущества JavaBean стиле.
  2. Привязать местное свойство струны к «свойству собственности», то есть имущество appleName объекта apple объекта Basket.

Первая часть легко:

public class Basket { 

    private final ObjectProperty<Apple> apple = new SimpleObjectProperty<>(); 

    public ObjectProperty<Apple> appleProperty() { 
     return apple ; 
    } 

    public final Apple getApple() { 
     return appleProperty().get(); 
    } 

    public final void setApple(Apple apple) { 
     appleProperty().set(apple); 
    } 
} 

Для второй части, чистый способ заключается в использовании EasyBind framework:

public class Food{ 

    public static void main(String[] args) { 
     Basket basket = new Basket(); 
     Apple rGreenApple = new Apple(); 
     rGreenApple.setAppleName("rGreenApple"); 
     basket.setApple(rGreenApple); 

     Property<String> localApple = EasyBind.monadic(basket.appleProperty()) 
      .selectProperty(Apple::appleNameProperty); 

     rGreenApple.appleNameProperty().set("rGreenApple 2"); 
     System.out.println(localApple.getValue()); //rGreenApple 2 

     Apple redApple = new Apple(); 
     redApple.setAppleName("rRedApple"); 
     basket.setApple(redApple); 

     System.out.println(localApple.getValue());// rRedApple 

     redApple.appleNameProperty().set("rRedApple 2"); 
     System.out.println(localApple.getValue());// rRedApple 2 
    } 
} 

Без EasyBind, вы должны управлять промежуточными слушателями рукой. Что-то вроде:

StringProperty localApple = new SimpleStringProperty(); 
    localApple.bindBidirectional(basket.getApple().appleNameProperty()); 
    basket.appleProperty().addListener((obs, oldApple, newApple) -> { 
     if (oldApple != null) { 
      localApple.unbindBidirectional(oldApple.appleNameProperty()); 
     } 
     if (newApple == null) { 
      localApple.set(""); 
     } else { 
      localApple.bindBidirectional(newApple.appleNameProperty()); 
     } 
    }); 
+0

Можем ли мы это сделать без каких-либо новых дополнительных зависимостей? – Jones

+0

Не легко ... В основном вы просто копируете соответствующие части кода рамки. –

+0

Добавлен способ сделать это без EasyBind. Если у вас более длинная цепочка свойств, она становится довольно уродливой. –

Смежные вопросы