[英]JavaFX: Make TableColumn observe formatted Double with extractor functionality
我有一個由自定義對象FermentableInRecipe
的ObservableList
填充的TableView
,其中TableColumn
之一定義為處理Number
,並且應將值顯示為百分比。
自定義對象由此類定義:
public class FermentableInRecipe extends Fermentable {
private DoubleProperty percentage = new SimpleDoubleProperty();
...
public Double getPercentage() {
return this.percentage.getValue();
}
public void setPercentage(Double value) {
if (value == null || value.isNaN() || value.isInfinite() || value > 1.0 || value < 0.0) {
this.percentage.setValue(0.0);
} else {
this.percentage.setValue(value);
}
}
public DoubleProperty percentageProperty() {
if (percentage == null) {
percentage = new SimpleDoubleProperty(0.0);
}
return percentage;
}
}
在我的控制器中是帶有子TableColumn
的TableView
對象。
@FXML
private TableView<FermentableInRecipe> tableviewFermentablesInRecipe;
@FXML
private TableColumn<FermentableInRecipe, Number> columnRecipeFermentablePercentage;
TableView
由我的自定義對象的以下ObservableList
填充,該對象已用提取程序實例化。
private ObservableList<FermentableInRecipe> fermentablesInRecipe
= FXCollections.observableArrayList(item -> new Observable[]{
item.WeightProperty(),
item.isLateAdd(),
item.isBulkBought()
});
tableviewFermentablesInRecipe.setItems(fermentablesInRecipe);
通過以下對setCellValueFactory()
和setCellFactory()
方法的使用(我基於先前的問題之一 ),我得到了要顯示的值。 但是,無論何時編輯ObservableList
的元素,它都不會更新(就像它忽略了我的提取器一樣)。 當我直接在自定義對象中觀察SimpleDoubleProperty
時,不會發生此行為(但是它將是未格式化的Double
)。
final JavaBeanDoublePropertyBuilder percentageCellBuilder
= JavaBeanDoublePropertyBuilder
.create()
.beanClass(FermentableInRecipe.class)
.name("percentage");
columnRecipeFermentablePercentage.setCellValueFactory(item -> {
try {
return percentageCellBuilder.bean(item.getValue()).build();
} catch (NoSuchMethodException ex) {
Logger.getLogger(MasterController.class.getName())
.log(Level.SEVERE, null, ex);
return null;
}
});
columnRecipeFermentablePercentage.setCellFactory(item ->
new PercentageCell<>()
);
這是百分比單元格類:
public class PercentageCell<T> extends TableCell<T, Number> {
NumberFormat percentageFormat = NumberFormat.getPercentInstance();
@Override
protected void updateItem(Number percentage, boolean empty) {
super.updateItem(percentage, empty);
if (percentage == null || empty) {
setText(null);
setStyle("");
} else {
setText(percentageFormat.format(percentage));
setStyle("-fx-alignment: CENTER;");
}
}
}
因此,問題是...如何獲取TableColumn
以顯示格式化的數字,同時仍然使提取器功能正常?
抱歉,如果該帖子太大,但是我不想遺漏任何內容。
正如@James_D指出的那樣,我正在不必要地使用JavaBeanDoubleProperty
因為我的自定義對象已經具有一個我可以利用的DoubleProperty
。
為了解決這個愚蠢的錯誤,我更改了此...
final JavaBeanDoublePropertyBuilder percentageCellBuilder
= JavaBeanDoublePropertyBuilder
.create()
.beanClass(FermentableInRecipe.class)
.name("percentage");
columnRecipeFermentablePercentage.setCellValueFactory(item -> {
try {
return percentageCellBuilder.bean(item.getValue()).build();
} catch (NoSuchMethodException ex) {
Logger.getLogger(MasterController.class.getName())
.log(Level.SEVERE, null, ex);
return null;
}
});
...到這個...
columnRecipeFermentablePercentage.setCellValueFactory(item ->
item.getValue().percentageProperty()
);
現在,通過我的提取器自動更新TableView
內容的工作完全符合預期。 傻我
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.