我想有這是由兩個屬性,即currentPrice
和volumeHeld
,其中currentPrice
實際上是通過下載谷歌資助的股票價格,每10秒獲得相乘,獲得的屬性total
。它每10秒自動更新一次。JavaFX的:綁定工作不正常
現在getCurrentPrice()
被初始化爲0
,如代碼所示。 10秒鐘後,它提供了一個新的價值,這一切工作正常。
但是在下面的綁定方法中,當currentPrice
屬性發生更改時,total
不會自動更新。
totalBinding = Bindings.createDoubleBinding(() -> {
System.out.println("current price: " + getCurrentPrice() + "vol held: " + getVolumeHeld());
return getCurrentPrice() * getVolumeHeld();
});
total.bind(totalBinding);
問題:我發現上面的createDoubleBinding
語句中的getCurrentPrice()
有值爲0(如上所述),當它的值被改變,改變是不是在total
屬性傳播。我的意思是,即使當前價格已經改變,total
屬性也無法從getCurrentPrice()
中提取新值。
所以問題是雙重的,但我猜的解決方案,對於這兩個問題,我下面會類似,如果不完全相同:
如何解決上述問題?
稍後,我將在
total
屬性綁定到另一個屬性制定出總的total
財產的所有Trade
對象)。這失敗了,它總是等於0. 這個方法寫在不同的類中,即不在Trade類中。
UPDATE:如下圖所示
代碼:
class SummaryofTrade{
...
sumOfTotals = new ReadOnlyDoubleWrapper();
sumOfTotalsBinding = Bindings.createDoubleBinding(() -> {
double sum = 0;
for(Trade t : this.observableListOfTrades){
sum += t.getTotal();
}
return sum;
}, total); // I cannot put "total" as a second parameter, as it is a property that resides in the Trade class , not this class.
sumOfTotals.bind(sumOfTotalsBinding);
...
}
錯誤日誌消息:
Caused by: java.lang.Error: Unresolved compilation problem:
total cannot be resolved to a variable
請注意:sumOfTotalsBinding
和sumOfTotals
住在另一個類。
規範貿易對象如下:
class Trade{
...
private final ReadOnlyDoubleWrapper total;
private final ReadOnlyDoubleWrapper currentPrice;
private DoubleProperty volumeHeld;
public DoubleBinding totalBinding;
private final ScheduledService<Number> priceService = new ScheduledService<Number>() {
@Override
public Task<Number> createTask(){
return new Task<Number>() {
@Override
public Number call() throws InterruptedException, IOException {
return getCurrentPriceFromGoogle();
}
};
}
};
public Trade(){
...
priceService.setPeriod(Duration.seconds(10));
priceService.setOnFailed(e -> priceService.getException().printStackTrace());
this.currentPrice = new ReadOnlyDoubleWrapper(0);
this.currentPrice.bind(priceService.lastValueProperty());
startMonitoring();
this.total = new ReadOnlyDoubleWrapper();
DoubleBinding totalBinding = Bindings.createDoubleBinding(() ->
getCurrentPrice() * getVolumeHeld(),
currentPriceProperty(), volumeHeldProperty());
total.bind(totalBinding);
}
// volume held
public double getVolumeHeld(){
return this.volumeHeld.get();
}
public DoubleProperty volumeHeldProperty(){
return this.volumeHeld;
}
public void setVolumeHeld(double volumeHeld){
this.volumeHeld.set(volumeHeld);
}
// multi-threading
public final void startMonitoring() {
priceService.restart();
}
public final void stopMonitoring() {
priceService.cancel();
}
public ReadOnlyDoubleProperty currentPriceProperty(){
return this.currentPrice.getReadOnlyProperty();
}
public final double getCurrentPrice(){
return currentPriceProperty().get();
}
// total
public final Double getTotal(){
return totalProperty().getValue();
}
public ReadOnlyDoubleProperty totalProperty(){
return this.total;
}
}
UPDATE 2015年9月15日:
我想闡述在這裏更合理的方式我的問題。讓我知道這是否沒有意義。謝謝。
首先,在上述Trade class
(請注意上面的代碼已被更新並指定的屬性依賴),每個交易對象包含一個total
屬性,這是currentPrice
和VolumeHeld
產物。如果用戶手動編輯當前價格和持有量的價值。 total
屬性將自動更新。
現在,我有一個Trade對象的ObservableList,它們每個都有一個total
屬性。我的目標是總結可觀察列表中每個Trade對象的total
屬性,並將總和綁定到名爲sumOfTotals
的變量。這是在一個名爲SummaryOfTrade
的課程中完成的。每當可觀察列表中任何一個交易的total
屬性發生更改時,sumOfTotals
屬性也應該自動更改。
class SummaryofTrade{
...
// within constructor, we have
sumOfTotals = new ReadOnlyDoubleWrapper();
sumOfTotalsBinding = Bindings.createDoubleBinding(() -> {
double sum = 0;
for(Trade t : this.observableListOfTrades){
sum += t.getTotal();
}
return sum;
}, totalProperty());
sumOfTotals.bind(sumOfTotalsBinding);
...
}
這就是問題的用武之地。Eclipse是說,它不承認貿易對象的屬性,totalProperty
。錯誤消息如下所示。
錯誤日誌消息:
Caused by: java.lang.Error: Unresolved compilation problem:
The method totalProperty() is undefined for the type SummaryOfTrade
我已經指定的屬性依賴已經又Eclipse是拋出一個錯誤。我應該如何解決這個問題?
爲什麼從@AlmasB回答不回答這個問題,這不是完全清楚(尤其是哪一類的屬性定義中並沒有區別在所有你如何編寫綁定)。綁定的值保持爲零,因爲您沒有在綁定中指定依賴關係。如果你在答案中解決它,它現在應該可以工作。也許你可以用[MCVE]更新來顯示剩下的問題是什麼? –
從上面,我確實在'createDoubleBinding'語句中指定了第二個參數'total',即綁定中的依賴關係,但eclipse不能識別它。錯誤在於'total property'不在'SummaryOfTrade'類中,所以我不能引用它。如果這仍然令人困惑,我會在今晚重新更新它。 – mynameisJEFF
@James_D請參閱更新,讓我知道它是否沒有意義。謝謝 – mynameisJEFF