1

このような動作は javafx2 バインディングのバグですか? スタンドアロン アプリケーション自体が自身の状態 (xPosition、yPosition、高さ、幅など) を常に自己認識しているのは当然のことのように思えます。「Pro JavaFX 2 Java テクノロジを使用したリッチ クライアントの決定版ガイド」という本を読んでいますが、一部のコード例が機能しません。注: ここで使用したコードは私のものです。(この本は関係ありますか?)

package simplejavafxbindingquestion;

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.event.EventHandler;
import javafx.geometry.VPos;
import javafx.scene.Scene;
import javafx.scene.SceneBuilder;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonBuilder;
import javafx.scene.control.Label;
import javafx.scene.control.LabelBuilder;
import javafx.scene.layout.HBox;
import javafx.scene.layout.HBoxBuilder;
import javafx.scene.layout.Pane;
import javafx.scene.layout.PaneBuilder;
import javafx.scene.layout.VBox;
import javafx.scene.layout.VBoxBuilder;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.scene.text.TextBuilder;
import javafx.stage.Stage;

public class SimpleJavaFXBindingQuestion extends Application {

  @Override
  public void start(final Stage stage) {

    Text textBoundStageHeight;
    Text textRequestedStageHeight;
    final Label labelRequestedStageHeight;
    VBox vBox;
    HBox hBox;
    Button btnRequest;
    Pane sceneRoot = PaneBuilder.create()
            .children(
              vBox = VBoxBuilder.create()
              .spacing(10)
              .children(
                textBoundStageHeight = TextBuilder.create()
                .textOrigin(VPos.TOP)
                .font(Font.font("Ariel", 20))
                .build(),
                hBox = HBoxBuilder.create()
                  .children(
                    textRequestedStageHeight = TextBuilder.create()
                      .textOrigin(VPos.TOP)
                      .font(Font.font("Ariel", 20))
                      .text("requested stage height: ")
                      .build(),
                    labelRequestedStageHeight = LabelBuilder.create()
                      .font(Font.font("Ariel", 20))
                      .text("Unknown")
                      .build()
                )
                .build(),
                btnRequest = ButtonBuilder.create()
                .text("Request height!")
                .font(Font.font("Ariel", 15))
                .onAction(new EventHandler<javafx.event.ActionEvent>() {
                  @Override
                  public void handle(javafx.event.ActionEvent event) {
                    labelRequestedStageHeight.setText("" + stage.getHeight());
                  }
                })
                .build()
              )
            .build()
            )
            .build();

    textBoundStageHeight.textProperty()
            .bind(new SimpleStringProperty("bound stage height: ")
            .concat(stage.getHeight()));

    Scene scene = SceneBuilder.create()
            .root(sceneRoot)
            .build();
    stage.setScene(scene);
    stage.show();
  }

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

1 に答える 1

0

「この動作」と言うと、「stage.getHeight()」に言及していると思います

textBoundStageHeight.textProperty()
            .bind(new SimpleStringProperty("bound stage height: ")
            .concat(stage.getHeight()));

concat javadocに記載されているように、この動作はバグではありません。

... また、他のオブジェクトが ObservableValue の実装である場合、他のオブジェクトの変更は結果の StringExpression に自動的に反映されます。

stage.getHeight()ではないためObservableValue、高さの値の変化は観測されません。一方stage.heightProperty()、実装ObservableValue

textBoundStageHeight.textProperty()
            .bind(new SimpleStringProperty("bound stage height: ")
            .concat(stage.heightProperty()));
于 2013-08-18T21:44:02.837 に答える