javafx
Propriétés et observable
Recherche…
Remarques
Les propriétés sont observables et des écouteurs peuvent y être ajoutés. Ils sont systématiquement utilisés pour les propriétés des Node
.
Types de propriétés et nom
Propriétés standard
Selon le type de propriété, il existe jusqu'à 3 méthodes pour une seule propriété. Soit <property>
le nom d'une propriété et <Property>
le nom de la propriété avec une première lettre en majuscule. Et laissez T
être le type de la propriété; Pour les wrappers primitifs, nous utilisons le type primitif ici, par exemple, String
pour StringProperty
et double
pour ReadOnlyDoubleProperty
.
Nom de la méthode | Paramètres | Type de retour | Objectif |
---|---|---|---|
<property>Property | () | La propriété elle-même, par exemple DoubleProperty , ReadOnlyStringProperty , ObjectProperty<VPos> | renvoyer la propriété elle-même pour ajouter des écouteurs / des liaisons |
get<Property> | () | T | renvoyer la valeur enveloppée dans la propriété |
set<Property> | (T) | void | définir la valeur de la propriété |
Notez que le setter n'existe pas pour les propriétés en lecture seule.
Propriétés de la liste en lecture seule
Les propriétés de liste en lecture seule sont des propriétés qui fournissent uniquement une méthode de lecture. Le type d'une telle propriété est ObservableList
, de préférence avec un agrument de type spécifié. La valeur de cette propriété ne change jamais; le contenu de ObservableList
peut être modifié à la place.
Propriétés de la carte en lecture seule
Semblable aux propriétés de liste en lecture seule, les propriétés de la carte en lecture seule fournissent uniquement un getter et le contenu peut être modifié au lieu de la valeur de la propriété. Le getter renvoie un ObservableMap
.
Exemple de StringProperty
L'exemple suivant montre la déclaration d'une propriété ( StringProperty
dans ce cas) et montre comment lui ajouter un ChangeListener
.
import java.text.MessageFormat;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
public class Person {
private final StringProperty name = new SimpleStringProperty();
public final String getName() {
return this.name.get();
}
public final void setName(String value) {
this.name.set(value);
}
public final StringProperty nameProperty() {
return this.name;
}
public static void main(String[] args) {
Person person = new Person();
person.nameProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
System.out.println(MessageFormat.format("The name changed from \"{0}\" to \"{1}\"", oldValue, newValue));
}
});
person.setName("Anakin Skywalker");
person.setName("Darth Vader");
}
}
Exemple ReadOnlyIntegerProperty
Cet exemple montre comment utiliser une propriété wrapper en lecture seule pour créer une propriété dans laquelle il est impossible d'écrire. Dans ce cas, le cost
et le price
peuvent être modifiés, mais le profit
sera toujours le price - cost
.
import java.text.MessageFormat;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.ReadOnlyIntegerProperty;
import javafx.beans.property.ReadOnlyIntegerWrapper;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
public class Product {
private final IntegerProperty price = new SimpleIntegerProperty();
private final IntegerProperty cost = new SimpleIntegerProperty();
private final ReadOnlyIntegerWrapper profit = new ReadOnlyIntegerWrapper();
public Product() {
// the property itself can be written to
profit.bind(price.subtract(cost));
}
public final int getCost() {
return this.cost.get();
}
public final void setCost(int value) {
this.cost.set(value);
}
public final IntegerProperty costProperty() {
return this.cost;
}
public final int getPrice() {
return this.price.get();
}
public final void setPrice(int value) {
this.price.set(value);
}
public final IntegerProperty priceProperty() {
return this.price;
}
public final int getProfit() {
return this.profit.get();
}
public final ReadOnlyIntegerProperty profitProperty() {
// return a readonly view of the property
return this.profit.getReadOnlyProperty();
}
public static void main(String[] args) {
Product product = new Product();
product.profitProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
System.out.println(MessageFormat.format("The profit changed from {0}$ to {1}$", oldValue, newValue));
}
});
product.setCost(40);
product.setPrice(50);
product.setCost(20);
product.setPrice(30);
}
}