Я пытаюсь иметь свойство total
, которое получается путем умножения двух свойств вместе, а именно currentPrice
и volumeHeld
, где currentPrice
фактически полученный путем загрузки Google профинансирует цена акций каждые 10 секунд. И он автоматически обновляется каждые 10 секунд.JavaFX: Наручники не работает, как ожидалось
Теперь getCurrentPrice()
инициализирован в 0
, как показано в коде. Через 10 секунд он получает новое значение, и все это прекрасно работает.
Но в приведенном ниже методе связывания total
не обновляется автоматически при изменении свойства currentPrice
.
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 9/15/2015:
Я пытаюсь разработать мою проблему в логическом порядке здесь. Дайте мне знать, если это не имеет смысла. Благодарю.
Во-первых, в Trade class
выше (пожалуйста, обратите внимание, что приведенный выше код был обновлен и указано свойство зависимостей), каждый объект торговли содержит total
свойство, которое является продуктом currentPrice
и VolumeHeld
.Если пользователь вручную отредактирует значения текущей цены и объема. Свойство total
будет обновляться автоматически.
Теперь у меня есть Объект ObservableList of Trade, каждый из которых имеет свойство total
. Моя цель состоит в том, чтобы суммировать свойство total
каждого объекта Trade в наблюдаемом списке и привязать сумму к переменной с именем 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);
...
}
Здесь возникает проблема. Затмение говорит, что он не признает свойство объекта Trade,, totalProperty
. Сообщение об ошибке, показанное ниже.
сообщение журнала ошибок:
Caused by: java.lang.Error: Unresolved compilation problem:
The method totalProperty() is undefined for the type SummaryOfTrade
Я уточнял зависимость свойств уже пока Eclipse, бросает ошибку. Как мне это разрешить?
Это не совсем понятно, почему ответ от @AlmasB не отвечает на этот вопрос (в частности, к какому классу свойства определяются не делает никакой разницы, как вы напишите привязку). Значения вашей привязки остались на нуле, потому что вы не указали зависимости в привязке.Если вы исправите это, как в этом ответе, он должен теперь работать. Возможно, вы можете обновить с помощью [MCVE], чтобы показать, каковы остальные проблемы? –
Сверху я указал второй параметр 'total' в' createDoubleBinding', т. Е. Зависимости в привязке, но eclipse не распознает его. Ошибка заключается в том, что 'total property' не живет в классе' SummaryOfTrade', поэтому я не мог ссылаться на него. Если это все еще запутывает, я снова обновлю его сегодня вечером. – mynameisJEFF
@James_D, пожалуйста, просмотрите обновление и сообщите мне, если это не имеет смысла. Спасибо – mynameisJEFF