如何在没有监听器的情况下绑定舞台属性?

时间:2013-08-18 16:11:56

标签: binding javafx

这样的行为是javafx2绑定中的错误吗? 似乎合乎逻辑的是,独立应用程序本身总是自我了解自己的状态(xPosition,yPosition,height,width等)。 我正在阅读“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);
  }
}

1 个答案:

答案 0 :(得分:0)

通过说“这种行为”我假设你在

中提到“stage.getHeight()”
textBoundStageHeight.textProperty()
            .bind(new SimpleStringProperty("bound stage height: ")
            .concat(stage.getHeight()));

这种行为不是错误,如concat javadoc:

中所述
  

...另外,如果另一个Object是ObservableValue的实现,   其他对象中的更改会自动反映在   结果是StringExpression。

因为stage.getHeight()不是ObservableValue,所以不会观察到高度值的变化。另一方面,stage.heightProperty()实现了ObservableValue

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