Binding JavaFX:GUI未刷新

Binding JavaFX:GUI未刷新,binding,javafx,Binding,Javafx,我使用新发布的Java8版本和JavaFX 我写了这个小测试程序来模拟我的问题 public class Main extends Application{ DoubleProperty widthProperty; public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage){

我使用新发布的Java8版本和JavaFX

我写了这个小测试程序来模拟我的问题

public class Main extends Application{

    DoubleProperty widthProperty;

    public static void main(String[] args) {
        launch(args);

    }

    @Override
    public void start(Stage primaryStage){
        HBox root = new HBox();
        HBox root2 = new HBox();
        HBox root3 = new HBox();

        Scene scene = new Scene(root, 1200, 800);

        primaryStage.setScene(scene);
        primaryStage.show();

        widthProperty = new SimpleDoubleProperty(400);

        root2.setPrefSize(400, 400);
        root3.setPrefHeight(400);
        root3.prefWidthProperty().bind(widthProperty);

        root2.setStyle("-fx-background-color: green");
        root3.setStyle("-fx-background-color: red");

        root2.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                root2.setMinWidth(600);
            }
        });

        root2.widthProperty().addListener(new ChangeListener<Number>() {

            @Override
            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    widthProperty.set((Double) newValue); 
                }
            });

            //widthProperty.set((Double) newValue); 
        }
    });

    root.getChildren().addAll(root2, root3);
}
public类主扩展应用程序{
双重属性;
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
公共无效开始(阶段primaryStage){
HBox根=新的HBox();
HBox root2=新的HBox();
HBox root3=新的HBox();
场景=新场景(根,1200,800);
初级阶段。场景(场景);
primaryStage.show();
widthProperty=新的SimpleDoubleProperty(400);
root2.setPrefSize(400400);
根3.根高(400);
root3.prefWidthProperty().bind(widthProperty);
root2.setStyle(“-fx背景色:绿色”);
root3.setStyle(“-fx背景色:红色”);
setOnMouseClicked(新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
根2.设置最小宽度(600);
}
});
root2.widthProperty().addListener(新的ChangeListener()){
@凌驾

更改公众假期(ObservalEvalue您正在更改根2的鼠标单击事件的
minWidth
,但是您正在更改根2的
widthProperty
时设置widthProperty变量。
minWidthProperty
widthProperty
是两个不同的属性,但widthProperty是只读属性,不能使用。)t由应用程序控制。它将由父节点在布局过程(窗口大小调整等)中控制,并考虑最小值、最大值和首选宽度值。因此,将侦听器添加到最小宽度属性:

root2.minWidthProperty().addListener(new ChangeListener<Number>() {
    @Override
    public void changed(ObservableValue<? extends Number> observable, Number oldValue, final Number newValue) {
        widthProperty.set((Double) newValue);
    }
});
root2.minWidthProperty().addListener(新的ChangeListener()){
@凌驾

更改公众假期(ObservableValuei检查了root2的宽度是否发生了变化,它确实发生了变化。然后我检查了root3的宽度是否也发生了变化,它确实发生了变化,因此bouth hbox的宽度设置正确,但ui没有刷新。是的,您是对的,widthproperty是只读的,但这并不重要。minwidth设置为400到600,因此idth也发生了变化。使用minwidth上的侦听器,结果是相同的。@AKR,在我的测试中,将更改侦听器添加到minWidthPrperty和widthProperty会产生不同的结果。可能是由于版本的原因,因为我已经在JavaFX 2.2上进行了测试。你也可以吗?我现在非常困惑……如果我将侦听器放在minwidth和将属性绑定到minwidthproperty。在java8中也是如此。