【问题标题】:Java Swing's TableModel getValueAt responsibilityJava Swing 的 TableModel getValueAt 职责
【发布时间】: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


【解决方案1】:

谁应该将格式化的显示呈现给用户?

视图。 JTable 使用renderers 来格式化/显示数据。

为了使不同表中双打的数据格式一致,您必须打开每个表模型并更改 getValueAt

数据不应更改。因此 getValueAt(...) 方法不应该改变。

一个渲染器可以被多个表共享。

您甚至可以通过覆盖JTablegetColumnClass(...) 方法来更改数据呈现给表的方式。

该表有一些 Boolean.class、Number.class、Icon.class 等的默认渲染器。

因此,例如,如果您在模型中存储了一个整数值,并且如果您覆盖表的 getColumnClass(...) 方法以返回:

  1. Integer.class - 数据将被格式化为数字并右对齐显示
  2. Object.cloass - 数据将被视为字符串并左对齐显示。

或者您甚至可以将自定义渲染器分配给TableColumnModel 中的特定列。因此,如果您希望将 Integer 格式化为“百分比”,您可以使用渲染器。

因此,最重要的是,当使用适当的渲染器时,相同的数据可以以无限多种方式显示。

查看Table Format Renderers,了解创建可重用格式渲染器的简单方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多