2017-08-07 3 views
0

私はChangeListenerを持っています。トリガーされるとfindGPA()メソッドが呼び出されます。 initialize()方法でStringPropertyをBigDecimalにバインドする方法は?

private BigDecimal decGPA = BigDecimal.ZERO; 

SubmitStageBorderPane.setBottom(AddStackCircle()); 

呼び出す:

private StackPane AddStackCircle(){ 

    StackPane stackCircle = new StackPane(); 
    StringProperty gpa = new SimpleStringProperty(""); 
    gpa.bind(new SimpleStringProperty(decGPA.toString())); 

    Text avgGPA = createText("Your semester GPA is: " + gpa); 
    Circle resultCircle = createCircle(avgGPA); 

    stackCircle.getStyleClass().add("stackCircle"); 
    stackCircle.getChildren().addAll(resultCircle, avgGPA); 

    return stackCircle; 
} 

private Circle createCircle(Text avgGPA){ 

    Circle resultCircle = new Circle(); 
    resultCircle.setFill(Color.GREEN); 
    resultCircle.setStroke(Color.GREY); 
    resultCircle.setStrokeWidth(3); 
    resultCircle.setRadius(getWidth(avgGPA)/2 + 10); 

    return resultCircle; 
} 

private Text createText(String text){ 

    Text avgGPA = new Text(text); 
    avgGPA.setBoundsType(TextBoundsType.VISUAL); 
    avgGPA.getStyleClass().add("avgGPA"); 

    return avgGPA; 
} 

をしかし、私はそれを実行すると、以下のように

private void findGPA(){ 
    GPA = gradeCre/sum; 
    decGPA = new BigDecimal(GPA); 
    decGPA = decGPA.setScale(2, RoundingMode.CEILING); 
    System.out.println("Your average GPA is: " + decGPA); 
} 

BigDecimal

が初期化されますそれはプロ次のラベルテキスト Your semester GPA is: StringProperty[bound, invalid]が生成され、 decGPAの値が変更されても変更されません。

+0

[異なる特性の双方向バインディング]の可能な重複(https://stackoverflow.com/questions:findGPA方法が適切に呼ばれ、それは次のように実施されるべきであると仮定すると

/14138082/bidirectional-binding-of-different-properties) – Flown

答えて

2

テキストを更新するには、単純にテキストを設定するのではなく、Textノードのテキストをバインドする必要があります。さらに、修飾されないプロパティ(例えばnew SimpleStringProperty(decGPA.toString()))だけでなく、実際に更新されるプロパティにバインドする必要があります。

private final ObjectProperty<BigDecimal> decGPA = new SimpleObjectProperty(BigDecimal.ZERO); 

private void findGPA(){ 
    GPA = gradeCre/sum; 
    decGPA.set(BigDecimal.valueOf(GPA).setScale(2, RoundingMode.CEILING)); 
    System.out.println("Your average GPA is: " + decGPA.get()); 
} 

private Text createText(ObservableValue<String> textExpression){ 

    Text avgGPA = new Text(); 
    avgGPA.textProperty().bind(textExpression); 
    avgGPA.setBoundsType(TextBoundsType.VISUAL); 
    avgGPA.getStyleClass().add("avgGPA"); 

    return avgGPA; 
} 
Text avgGPA = createText(decGPA.asString("Your semester GPA is: %s")); 
+0

ありがとうございました!意図どおりに動作する –

関連する問題