1

私は簡単なタスクを達成しようとしていました。チェックボックスをオンにするとステージのサイズを変更でき、チェックボックスをオフにするとステージのサイズを変更できません。

コード:

 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());
           }
      });

しかし、bindBidirectionコードが機能しないのはなぜですか?

4

2 に答える 2

3

これは、JavaFX 8.0(現在のJava 8.0 EAPリリースで利用可能)で修正されたStageクラスのバグです。

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();
  }
}
于 2013-01-14T08:59:02.330 に答える
0

ええ、私もこれに気づきました...そして、バインディングプロパティにより、イベントハンドラーで行われる簿記が不要になるため(おそらくバグが少なくなります!)、これまでのところ、上記の例は、現時点で実行できる唯一のことのようです。これを自分で発見し、ここで検証したので、主題に関する本がこのバグについて言及していないのは少し気になります。たとえば、私は最初に、Pro JavaFX 2:Javaテクノロジを使用したリッチクライアントへの決定的なガイドから抜粋した例を使用して、この概念を試しました。第2章の最初の例では、このバインディングに触れており、特別な注意を払っています。

ヒント:バインドされているプロパティは明示的に設定できません。スニペットの前のコードでは、プロパティが次の行にバインドされる前に、サイズ変更可能なプロパティがsetResizable()メソッドで設定されています。

あなたは私たちにこれを伝えるために苦労を経験したと思うでしょう、著者もこのバグを知っていたでしょう。私たちの正気を維持するのに役立つこのような場所に感謝します;-)

于 2013-07-04T19:50:24.473 に答える