我有一个SimpleElement
类,其中有一个权重字段,第二个类有一个SimpleElement
列表,并且一个权重字段取决于列表中包含的所有其他SimpleElement
的权重之和。有谁知道如何通过绑定来做到这一点?
我的代码:
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
public class SimpleElement {
IntegerProperty weight;
public SimpleElement() {
weight = new SimpleIntegerProperty();
}
public int getWeight() {
return weight.get();
}
public void setWeight(int weight) {
this.weight.set(weight);
}
public IntegerProperty weightProperty() {
return weight;
}
}
和
import java.util.ArrayList;
import java.util.List;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
public class RootElement {
List<SimpleElement> elements;
IntegerProperty weight;
public RootElement() {
elements = new ArrayList<>();
weight = new SimpleIntegerProperty();
}
public void addelements(SimpleElement element) {
elements.add(element);
}
}
最佳答案
可以重写RootElement
类以创建每个SimpleElement
的绑定,并将它们加起来:
public class RootElement {
List<SimpleElement> elements;
IntegerProperty weight;
NumberBinding binding;
public RootElement() {
elements = new ArrayList<>();
weight = new SimpleIntegerProperty();
}
public void addelements(SimpleElement element) {
elements.add(element);
if (binding == null) {
binding = element.weightProperty().add(0);
} else {
binding = binding.add(element.weightProperty());
}
weight.bind(binding);
}
public Integer getWeight() {
return weight.get();
}
public ReadOnlyIntegerProperty weightProperty() {
return weight;
}
}
用法示例:
public static void main(String[] args) {
SimpleElement se1 = new SimpleElement();
SimpleElement se2 = new SimpleElement();
SimpleElement se3 = new SimpleElement();
RootElement root = new RootElement();
root.addelements(se1);
root.addelements(se2);
root.addelements(se3);
root.weightProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
System.out.println(newValue);
}
});
se1.setWeight(3);
se2.setWeight(2);
se1.setWeight(4);
}
上面代码的执行产生:
3
5
6