2013-08-18 10 views
1

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

답변

0

"이 문제가"나는 당신이

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

그 행동 "stage.getHeight()"을 언급하고 있다고 가정 말하는 것입니다없는 버그에 설명 된대로 concat 자바 독은 : 다른 개체 ObservableValue의 구현은 또한 경우

..., 다른 개체에 변화는 얻어진 취소 선으로 자동 반영 표현.

stage.getHeight()ObservableValue이 아니기 때문에 높이 값의 변화는 관찰되지 않습니다. 반면에 stage.heightProperty()ObservableValue을 구현합니다.

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