javafx
Propiedades y observables
Buscar..
Observaciones
Las propiedades son observables y se pueden agregar oyentes. Se utilizan constantemente para las propiedades de Node
s.
Tipos de propiedades y nombres
Propiedades estandar
Dependiendo del tipo de propiedad, hay hasta 3 métodos para una sola propiedad. Deje que <property>
indique el nombre de una propiedad y <Property>
el nombre de la propiedad con una primera letra en mayúscula. Y sea T
el tipo de propiedad; para envolturas primitivas usamos el tipo primitivo aquí, por ejemplo, String
para StringProperty
y double
para ReadOnlyDoubleProperty
.
Nombre del método | Parámetros | Tipo de retorno | Propósito |
---|---|---|---|
<property>Property | () | La propiedad en sí, por ejemplo. DoubleProperty , ReadOnlyStringProperty , ObjectProperty<VPos> | devolver la propiedad en sí para agregar oyentes / vinculante |
get<Property> | () | T | Devolver el valor envuelto en la propiedad. |
set<Property> | (T) | void | establecer el valor de la propiedad |
Tenga en cuenta que el configurador no existe para las propiedades de solo lectura.
Propiedades de la lista de solo lectura
Las propiedades de la lista de solo lectura son propiedades que proporcionan solo un método de obtención. El tipo de dicha propiedad es ObservableList
, preferiblemente con un tipo de documento especificado. El valor de esta propiedad nunca cambia; el contenido de la lista ObservableList
se puede cambiar en su lugar.
Propiedades de mapas de solo lectura
Al igual que en las propiedades de la lista de solo lectura, las propiedades del mapa de solo lectura proporcionan un captador y el contenido puede modificarse en lugar del valor de la propiedad. El getter devuelve un ObservableMap
.
Ejemplo de StringProperty
El siguiente ejemplo muestra la declaración de una propiedad ( StringProperty
en este caso) y muestra cómo agregar un ChangeListener
a ella.
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");
}
}
Ejemplo de ReadOnlyIntegerProperty
Este ejemplo muestra cómo usar una propiedad de contenedor de solo lectura para crear una propiedad en la que no se puede escribir. En este caso, el cost
y el price
pueden modificarse, pero el profit
siempre será el 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);
}
}