【发布时间】:2019-06-10 07:52:36
【问题描述】:
在 javaFX 视图控制器的初始化方法中,我有一个 TableView 列渲染器,它显示财务金额,每个单元格都以金额和红色或蓝色呈现,具体取决于金额是借方金额还是贷方金额.
@Override
public void initialize(URL url, ResourceBundle rb)
budgetAmountCol.setCellValueFactory(cellData -> cellData.getValue().budgetAmountProperty());
// Custom rendering of the budget amount cells in the column.
budgetAmountCol.setCellFactory((TableColumn<TxnObject, String> column) -> {
return new TableCell<TxnObject, String>() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
}
else {
double amt = Double.parseDouble(item);
if (amt == 0) {
setId("zero-amt");
} else {
if (amt < 0){
item = item.substring(1, item.length());
setId("debit-amt");
} else {
setId("credit-amt");
}
}
}
setText(item);
}
};
});
因为我有几列需要类似地呈现,所以我试图避免大量的源代码,并将上面的内容变成一个可以传递参数的方法,从而呈现列,比如
private void renderColumn(..) { }
占据列中表格单元格的变量在对象定义中定义如下:
public class TxnObject {
..
private final StringProperty budgetAmount;
..
public String getbudgetAmount() {
double d = Double.parseDouble(budgetAmount.get());
setbudgetAmount(MainApp.formatAmount(d));
return budgetAmount.get();
}
public void setbudgetAmount(String budgetAmount) {
this.budgetAmount.set(budgetAmount);
}
public StringProperty budgetAmountProperty() {
return budgetAmount;
}
因此要求是传递代码第二行的内容,即
budgetAmountCol.setCellValueFactory(cellData -> cellData.getValue().budgetAmountProperty());
渲染列:因此该方法至少需要表格列和变量属性:
private void renderColumn(TableColumn<TxnObject, String> tcol, StringProperty sprop) {
node.setCellValueFactory(..)
}
但我无法正确调用该方法。我已经尝试了以下结果:
renderColumn(budgetAmountCol, budgetAmountProperty());
syntax error: no method BudgetAmountProperty()
renderColumn(budgetAmountCol, cellData.getValue().budgetAmountProperty());
syntax error: Cannot find symbol CellData
renderColumn(budgetAmountCol, cellData -> cellData.getValue().budgetAmountProperty());
syntax error: StringProperty is not a functional interface
我发现如何实现我的目标的语法和理解相当具有挑战性,如果我能得到一些建议来尝试实现解决方案,我将不胜感激。
【问题讨论】:
-
在 fx 中它不被称为“渲染器”,它是一个“TableCell”:) 不,你不能委托“渲染”它是一个 cellFactory 每列创建一个(内部)可重用TableCell 每当它需要一个。但是您可以将工厂的创建委托给一个方法,并在实例化列时调用它。
-
不相关:想知道为什么单元格内容是字符串,不应该是某种类型的数字,例如 Double 或更高精度的 BigDecimal?
标签: javafx tableview tablecolumn