JavaFX Beans Binding repentinamente para de funcionar
Eu uso JavaFX NumberBindings para calcular certos valores. Inicialmente, tudo funciona como esperado. Após um período de tempo bastante pequeno, no entanto, a ligação para de funcionar. Também não recebo uma exceção.
Eu tentei várias ligações, bem como abordagens de alto e baixo nível. Até o próprio cálculo (quando substituído) simplesmente para e não é mais chamado. Também atualizei para o JDK mais recente (1.8.0_05) e reconstruí / reiniciei tudo.
O seguinte exemplo de trabalho mínimo ilustra o problema. Deve System.out.println a largura atual da janela principal para STDOUT. Após redimensionar a janela por cerca de 10 segundos, a saída simplesmente pára. Também tentei vincular a propriedade resultante a um controle JavaFX, a fim de garantir o uso continuado da propriedade, mas isso não serviu de nada. Acredito que estou perdendo algum comportamento muito básico da Propriedade / Ligações aqui, o Google parece não conhecer esse comportamento.
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);
}
}