2017-08-07 30 views
0

我有一個ChangeListener,當觸發時,調用findGPA()方法。如何將StringProperty綁定到BigDecimal?

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被初始化爲如下:

private BigDecimal decGPA = BigDecimal.ZERO; 

initialize()方法:

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

然而,當我運行它,它贊成使用以下標籤文本Your semester GPA is: StringProperty[bound, invalid],即使decGPA的值發生更改也不會改變。

+0

的[不同性質的雙向綁定](可能的複製https://stackoverflow.com/questions/14138082 /不同屬性的雙向綁定) – Flown

回答

2

要更新文本,您需要綁定Text節點的文本,而不是簡單地設置文本。此外,你應該將它綁定到一個實際更新的屬性,而不僅僅是一個永遠不會被修改的屬性(如new SimpleStringProperty(decGPA.toString()))。

假設findGPA方法被適當地調用時,它應該被實現這樣的:

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

非常感謝!按預期工作 –

相關問題