[英]Formatting integer while binding to label
我正在嘗試將整數綁定到標簽的text屬性時設置格式。
我知道我可以在值設置器中使用setText(),但我希望通過綁定以正確的方式進行操作。
在控制器初始化中,我有:
sec = new SimpleIntegerProperty(this,"seconds");
secondsLabel.textProperty().bind(Bindings.convert(sec));
但是,當秒數降至10以下時,它顯示為一位數字,但是我希望它保持兩位數字。 所以我嘗試將Binding更改為以下內容:
secondsLabel.textProperty().bind(Bindings.createStringBinding(() -> {
NumberFormat formatter = NumberFormat.getIntegerInstance();
formatter.setMinimumIntegerDigits(2);
if(sec.getValue() == null) {
return "";
}else {
return formatter.format(sec.get());
}
}));
這將格式化它,但是當我覆蓋它時sec.set(newNumber);
值不變。
我也試過這個:
secondsLabel.textProperty().bind(Bindings.createStringBinding(() -> {
if(sec.getValue() == null) {
return "";
}else {
return String.format("%02d", sec.getValue());
}
}));
但這也做同樣的事情。 加載正常,顯示兩位數,但是通過sec.set(newNumber);
更改了數字時sec.set(newNumber);
沒有改變。 該數字永遠不會高於60或低於零
您需要告訴綁定,無論sec
屬性何時無效,綁定都應該無效。 Bindings.createStringBinding(...)
在函數之后采用一個varargs參數,該參數應傳遞綁定需要綁定到的任何屬性。 您可以直接修改您的代碼,如下所示:
secondsLabel.textProperty().bind(Bindings.createStringBinding(() -> {
NumberFormat formatter = NumberFormat.getIntegerInstance();
formatter.setMinimumIntegerDigits(2);
if(sec.getValue() == null) {
return "";
}else {
return formatter.format(sec.get());
}
}, sec));
要么
secondsLabel.textProperty().bind(Bindings.createStringBinding(() -> {
if(sec.getValue() == null) {
return "";
}else {
return String.format("%02d", sec.getValue());
}
}, sec));
正如@fabian指出的那樣, IntegerProperty.get()
永遠不會返回null,因此您可以刪除null檢查,然后執行以下操作:
secondsLabel.textProperty().bind(Bindings.createStringBinding(
() -> String.format("%02d", sec.getValue()),
sec));
綁定API中有一個方便的版本:
secondsLabel.textProperty().bind(Bindings.format("%02d", sec));
IntegerProperty繼承了許多有用的方法,包括asString :
secondsLabel.textProperty().bind(sec.asString("%02d"));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.