【发布时间】:2021-03-31 09:39:25
【问题描述】:
Java Swing 的TableModel 的职责是什么...
谁应该向用户展示格式化的显示?
有官方指导吗?
JavaDocs
getValueAt 的帮助说明:
返回 columnIndex 和 rowIndex 处单元格的值。
这里没有提到格式化。它返回单元格的“值”。一个Object。
我见过不同的实现方式——甚至在我从事过的产品中也是如此。我觉得没有太大的一致性。
示例
表格模型
DecimalFormat decimalFormat = new DecimalFormat("#.###");
@Override
public Object getValueAt(int row, int column) {
...
decimalFormat.format(myObjectModel.GetFoo(row).getSomeDoubleProperty());
}
DefaultTableCellRenderer
public final class PositionDoubleCellRenderer extends DefaultTableCellRenderer {
private final String formatPattern = "%,.03f";
@Override
public Component getTableCellRendererComponent(
final JTable table, Object value, final boolean isSelected, final boolean hasFocus, final int row, final int column
) {
String formattedValue = "";
if (value instanceof Double) {
double numeric = (Double) value;
if (ConstantsModel.isConstant(numeric)) {
formattedValue = "";
} else {
formattedValue = String.format(formatPattern, numeric);
}
}
return super.getTableCellRendererComponent(table, formattedValue, isSelected, hasFocus, row, column);
}
}
根据您使用的机制,有优劣之分。我不知道有什么其他的方法来格式化我的头脑,但我已经有一段时间了这个想法。
【问题讨论】:
-
嗯,这取决于。您的模型是否将数据实际公开为字符串?如果是这样格式化
getValueAt()中的双打就可以了。如果模型旨在公开实际的数据类型(我更喜欢那样),那么渲染器可能是更好的方法。我的猜测是,从模型中返回格式化字符串对开发人员来说更容易,因为他们不必提出渲染器。 -
就“官方指导”而言(至少据我所知):正如您正确指出的那样“返回 columnIndex 和 rowIndex 处单元格的 值。”已经声明它应该是值而不是格式化的表示。
-
是的,我也有这种感觉。但为了在不同的表中为双精度数据提供一致的数据格式,您必须打开每个表模型并更改 getValueAt。我只是感觉到在 getValueAt 中的格式化会导致 SRP 和 OCP 违规。
-
好吧,我想说的是,当格式需要保持一致时,应该为不同的表使用相同的渲染器。如果只需要将格式应用于特定列,那么该列的类型也应该是特定的。
标签: java swing tablemodel