javafx bindBidirectional绑定不适用于stage resizble和checkbox slected属性

时间:2013-01-13 01:52:52

标签: binding javafx-2 javafx

我正在尝试实现简单的任务,如果选中复选框,则舞台可以调整大小,如果未选中复选框,则无法调整大小。

代码:

 checkBox.selectedProperty().bindBidirectional(stage.resizableProperty());

上面的代码没有按预期工作!,我可以使用以下代码获得预期的结果

  checkBox.selectedProperty().addListener(new ChangeListener() {
         @Override
         public void changed(ObservableValue ov, Object t, Object t1) {
            stage.setResizable(checkBox.selectedProperty().getValue());
           }
      });

但是想知道为什么bindBidirectional代码不起作用?

2 个答案:

答案 0 :(得分:3)

这是Stage类中的一个错误,它在JavaFX 8.0中修复(在当前的Java 8.0 EAP版本中可用)。

请注意,当绑定双向时,resizableProperty实际上是正确设置的,设置值只有效果。

我的测试:

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class StageResizableTest extends Application{

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

  @Override
  public void start(final Stage stage) throws Exception {
    Button button = new Button("resize");

    button.setOnAction(new EventHandler<ActionEvent>() {
      @Override
      public void handle(ActionEvent actionEvent) {
        stage.setResizable(true);
      }
    });

    Button button2 = new Button("not resize");

    button2.setOnAction(new EventHandler<ActionEvent>() {
      @Override
      public void handle(ActionEvent actionEvent) {
        stage.setResizable(false);
      }
    });

    CheckBox checkBox = new CheckBox("Resizable");

    checkBox.selectedProperty().bindBidirectional(stage.resizableProperty());

    checkBox.selectedProperty().addListener(new ChangeListener<Boolean>() {
      @Override
      public void changed(ObservableValue<? extends Boolean> observableValue, Boolean aBoolean, Boolean aBoolean2) {
        System.out.println("checkbox changed from "+aBoolean+" to "+aBoolean2);
      }
    });

    stage.resizableProperty().addListener(new ChangeListener<Boolean>() {
      @Override
      public void changed(ObservableValue<? extends Boolean> observableValue, Boolean aBoolean, Boolean aBoolean2) {
        System.out.println("stage resizable changed from "+aBoolean+" to "+aBoolean2);
      }
    });

    Button button3 = new Button("request stage resizable");

    button3.setOnAction(new EventHandler<ActionEvent>() {
      @Override
      public void handle(ActionEvent actionEvent) {
        System.out.println(stage.resizableProperty().get());
      }
    });

    VBox box = new VBox();

    box.getChildren().addAll(checkBox, button, button2, button3);

    Scene scene = new Scene(box, 500, 500);

    stage.setScene(scene);

    stage.show();
  }
}

答案 1 :(得分:0)

是的,我也注意到了这一点......不幸的是,绑定属性使你在事件处理程序中完成簿记工作变得不必要(并且大概有更少的错误!)到目前为止,我发现编写自己的事件处理程序为上面的例子中显示的似乎是现在唯一要做的事情。现在我自己发现了这个 - 并在这里验证过 - 让我感到困扰的是,关于这个主题的书籍没有提到这个错误。例如,我首先使用 Pro JavaFX 2:使用Java技术的富客户端权威指南中的示例玩弄了这个概念。第2章中的第一个例子涉及这种绑定,甚至特别注意:

  

提示:无法显式设置绑定的属性。在代码中   在代码段之前,resizable属性设置为   之前的setResizable()方法属性绑定在下一行。

你会认为通过麻烦告诉我们这一点,作者也会知道这个错误。谢天谢地,这样的地方有助于保持我们的理智; - )