我在 UI 上有 4 个 JavaFx Text 对象。这 4 个对象绑定到 4 个不同的 DoubleBinding
我有一个叫做价格的双重属性。
所有 4 个 DoubleBindings 都绑定到此价格属性。本质上,当价格发生变化时,会使用价格执行 4 种不同的计算,并更新 4 个不同的字段。
volatilityProperty = new DoubleBinding() {
{
super.bind(priceProperty);
}
@Override
protected double computeValue()
{
}
}
这一切都很有效。
但是我注意到,当价格发生变化时,每个 DoubleBindings 都会在单个线程中顺序调用,并调用其computeValue 方法。是否有一个选项可以让每个 DoubleBindings 在价格发生变化时立即在新线程中启动?
我尝试在双绑定的重写的computeValue中使用Task来强制多线程 - 但由于某种原因,如果在每个DoubleBindings中使用任务,则需要更长的时间才能完成所有4个计算。
不。 JavaFX 属性必须在一个且仅一个线程中设置:JavaFX 应用程序线程。但是,您可以绑定到使用任务在其他线程中进行计算的Service:
public class VolatilityCalculator
extends Service<Double> {
private final DoubleProperty price;
public double getPrice() {
return price.get();
}
public void setPrice(double price) {
this.price.set(price);
}
public DoubleProperty priceProperty() {
return price;
}
public VolatilityCalculator() {
this.price = new DoubleProperty(this, "price");
}
@Override
protected Task<Double> createTask() {
double priceForCalculations = getPrice();
return new Task<Double>() {
@Override
protected Double call()
throws InterruptedException {
// Long-running computation code goes here.
// That code may want to check isCancelled() periodically.
}
}
}
}
那么您的应用程序可以:
像这样:
VolatilityCalculator volatilityCalculator = new VolatilityCalculator();
volatilityCalculator.priceProperty().bind(priceProperty);
volatilityProperty.bind(volatilityCalculator.valueProperty());
有关货币价值的强制性说明:
double
不存储确切的值。如果这只是一个学习或学校项目,那没问题,但商业应用程序一定不能将金钱存储为double
值,因为这些值实际上可能会丢失信息。 BigDecimal 是推荐的货币存储类型。或者,有些人建议使用 int
或 long
代表以美分或美分的分数表示的价格(或者,如果不是美分,则以您所在国家/地区的最小货币单位为准)。