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);
    }
    
}


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow