2015-02-09 2 views
1

Я смотрю http://docs.oracle.com/javase/8/javafx/api/javafx/beans/property/SimpleObjectProperty.html, и я немного смущен.JavaFX beans против свойств - почему оба?

можно создать SimpleObjectProperty используя третий конструктор,

SimpleObjectProperty(Object bean, String name, T initialValue) 

в Clojure следующим образом: (def sop (SimpleObjectProperty. 5 "mysop" 6))

Это создает SimpleObjectProperty со значением Bean = 5 (типа java.lang.Long) и не-Bean значения = 6, также типа (java.lang.Long).

Почему существуют два разных значения? Какова цель «Бин» в этом случае? Какой из них я должен использовать? Я пытаюсь инкапсулировать общий объект Clojure, на котором я могу установить Listeners, поэтому я думаю, что это либо это, либо ObjectPropertyBase, который является одним из элементов иерархии, а также напрямую.

Я медленно поглощал Java, если необходимо, чтобы понять, как использовать JavaFX в Clojure, но это сбивает с толку.

Спасибо! :)

ответ

3

«Боб» - это объект, для которого свойство ObjectProperty является свойством (другими словами, это объект Java, который «владеет» ObjectProperty). См. documentation here.

Это может быть полезно, если у вас есть изменения слушателя, зарегистрированный свойства из нескольких источников, и вы хотите, чтобы иметь возможность различать объект, состояние которого изменилось:

ChangeListener<Object> listener = (observable, oldValue, newValue) -> { 
    ObjectProperty objProp = (ObjectProperty) observable ; 
    Object bean = objProp.getBean(); 
    // do something.... 
}; 

someProperty.addListener(listener); 
someOtherProperty.addListener(listener); 

Обычно вы будете использовать ссылку боба как следует:

public class Person { 
    // parameters are "owning bean" (i.e. this person), property name, and initial value: 
    private final StringProperty name = new SimpleStringProperty(this, "name", "Fred"); 
    public StringProperty nameProperty() { 
     return name ; 
    } 
    public final String getName() { 
     return nameProperty().get(); 
    } 
    public final void setName(String name) { 
     nameProperty().set(name); 
    } 
    // ... 
} 
+0

Спасибо, поэтому первый аргумент по существу является родителем компонента в терминах инкапсуляции. – Sonicsmooth

+0

@Sonicsmooth большую часть времени вы просто не заботитесь о «bean» и «name» и можете просто использовать 'new SimpleObjectProperty (initialValue)'. Обратите внимание, что в предположительно полезном случае @James_D упоминания, вам нужно будет сделать две броски, чтобы на самом деле сделать что-нибудь полезное. Мне еще нужно увидеть фактическое полезное использование атрибутов bean и name, кроме показа их в отладочном выходе. –

+0

@ Томас Микула Согласен: я предпочитаю не делиться слушателями вообще. Я сказал: «* может быть * полезно»;). –

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