javafx
Właściwości i obserwowalne
Szukaj…
Uwagi
Właściwości są obserwowalne i można do nich dodawać detektory. Są one konsekwentnie stosowane do właściwości Node
.
Rodzaje właściwości i nazewnictwo
Standardowe właściwości
W zależności od rodzaju właściwości dostępne są maksymalnie 3 metody dla jednej właściwości. Niech <property>
oznacza nazwę właściwości, a <Property>
nazwę właściwości z wielką pierwszą literą. I niech T
będzie typem własności; w przypadku pierwotnych opakowań używamy tutaj typu pierwotnego, np. String
dla StringProperty
i double
dla ReadOnlyDoubleProperty
.
Nazwa metody | Parametry | Rodzaj zwrotu | Cel, powód |
---|---|---|---|
<property>Property | () | Sama właściwość, np DoubleProperty , ReadOnlyStringProperty , ObjectProperty<VPos> | zwraca samą właściwość w celu dodania detektorów / powiązania |
get<Property> | () | T | zwraca wartość zawiniętą we właściwość |
set<Property> | (T) | void | ustaw wartość właściwości |
Zauważ, że setter nie istnieje dla właściwości tylko do odczytu.
Właściwości listy tylko do odczytu
Właściwości listy tylko do odczytu są właściwościami, które zapewniają jedynie metodę gettera. Typem takiej właściwości jest ObservableList
, najlepiej z określonym typem agrumentu. Wartość tej właściwości nigdy się nie zmienia; zamiast tego treść ObservableList
może zostać zmieniona.
Właściwości mapy tylko do odczytu
Podobnie jak w przypadku właściwości listy tylko do odczytu właściwości mapy tylko do odczytu zapewniają tylko moduł pobierający, a treść może być modyfikowana zamiast wartości właściwości. Moduł pobierający zwraca ObservableMap
.
Przykład StringProperty
Poniższy przykład pokazuje deklaracja właściwości ( StringProperty
w tym przypadku) i pokazuje, jak dodać ChangeListener
do niego.
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");
}
}
Przykład ReadOnlyIntegerProperty
W tym przykładzie pokazano, jak użyć właściwości opakowania tylko do odczytu, aby utworzyć właściwość, której nie można zapisać. W takim przypadku cost
i price
mogą być modyfikowane, ale profit
zawsze będzie 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);
}
}