Привязка JavaFX Beans внезапно перестает работать
Я использую JavaFX NumberBindings для вычисления определенных значений. Изначально все работает как положено. Однако через некоторое время привязка перестает работать. Я тоже не получаю исключения.
Я пробовал несколько привязок, а также подходы высокого и низкого уровня. Даже сам расчет (при переопределении) просто останавливается и больше не вызывается. Я также обновил до последней версии JDK (1.8.0_05) и перестроил / перезапустил все.
Следующий минимальный рабочий пример иллюстрирует проблему. Это должно System.out.println текущей ширины главного окна для STDOUT. После изменения размера окна в течение примерно 10 секунд вывод просто останавливается. Я также попытался привязать полученное свойство к элементу управления JavaFX, чтобы обеспечить его дальнейшее использование, но это не помогло. Я полагаю, что здесь отсутствует какое-то очень простое поведение свойства / привязок, похоже, что Google вообще не знает этого поведения.
import javafx.application.Application;
import javafx.beans.binding.NumberBinding;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class BindingsProblem extends Application {
@Override
public void start(Stage primaryStage) {
// Initialization...
StackPane root = new StackPane();
Scene scene = new Scene(root, 300, 250);
primaryStage.setScene(scene);
primaryStage.show();
// Binding - The problem occurrs here!
NumberBinding currentWidthPlusTen = primaryStage.widthProperty().add(10);
IntegerProperty boundNumberProperty = new SimpleIntegerProperty();
boundNumberProperty.bind(currentWidthPlusTen);
boundNumberProperty.addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
System.out.println(newValue.toString());
}
});
}
public static void main(String[] args) {
launch(args);
}
}