【问题标题】:Java swing cell renderer based on column class基于列类的 Java swing cell 渲染器
【发布时间】:2021-01-24 08:04:05
【问题描述】:

在 Java Swing 中,我们有一个 JTableTableModelColumnModel 和一个 TableCellRenderer,它们一起工作以显示一个表格。

如何提供自定义以获取基于列类的自定义单元格渲染器 - 而不是基于列索引设置渲染器。

final JTable table = new JTable(model);
table.getColumnModel().getColumn(0).setCellRenderer(new DateTimeRenderer());
table.getColumnModel().getColumn(1).setCellRenderer(new SuperDuperDoubleCellRenderer());

假设我有 20 个数字单元格!!!

上述方法可行,但我并不热衷于该解决方案,因为它会在模型​​更改时发生变化 - 所以它没有很好地封装到那种程度 - 这是客户端代码。

TableModel 了解底层表数据结构,它可以在其中自定义映射到复杂类型(与 DefaultTableModel 和 Vectors 不同)——它知道每列的数据类型。

public class DemoTableModel implements TableModel {
    @Override
    public Class<?> getColumnClass(int columnIndex) {
        // date time, double, etc...
        return columnInfo.get(columnIndex).getDataType();
    }
}

我想做的是告诉JTable,嘿,列类(从表模型返回)是自定义日期时间类型 - 使用CustomDateTimeCellRenderer。如果是双精度,则使用自定义的SuperDuperDoubleCellRenderer

麻烦在于挖掘源头,看看这种行为在哪里结合。

【问题讨论】:

    标签: java swing jtable tablecellrenderer


    【解决方案1】:

    我想做的是告诉一个 JTable,嘿列类(从表模型返回)是一个自定义的 DateTime 类型 - 使用 CustomDateTimeCellRenderer。如果是双精度,则使用自定义的 SuperDuperDoubleCellRenderer。

    您通过指定类和渲染器在表级别设置渲染器:

    table.setDefaultRenderer(Double.class, yourDoubleCellRenderer);
    table.setDefaultRenderer(CustomDateTime.class, yourCustomDateTimeRenderer);
    

    【讨论】:

    • 呸!我没有看到课程的参数。谢谢。
    【解决方案2】:

    您可以在 CellRenderer 级别执行此操作 - 只需实现单元格渲染器

    Component getTableCellRendererComponent​(JTable table,
                                        Object value,
                                        boolean isSelected,
                                        boolean hasFocus,
                                        int row,
                                        int column)
    

    没有什么能阻止您告诉整个 JTable 使用 SmartCellRenderer 渲染单元格,它查看传入值的类型并将实际渲染委托给 DoubleCellRendererStringCellRendererCuteInternetCatRenderer。假设对象类型是唯一的,这应该很容易做到(如果有点难看,因为 if (value instanceof InternetCat) { ... } 的集合决定如何根据其类呈现每个对象)。

    更好的解决方案(不需要丑陋的instanceofs)是在列插入时将特定的渲染器分配给特定的列:

     // model index 0, width 75, renderer to use, editor to use
     myTable.getColumnModel().addColumn(0, 75, cuteInternetCatRenderer, null);
    

    【讨论】:

    • 是的,我担心的是全面启动一个新的 JTable 实例并在其中重复此逻辑。我想对这种行为进行抽象是有意义的,而不是每个客户端都添加所有默认的单元格渲染器。
    • 典型的做法是将默认的JTable 子类化为CatTable - 并且只创建该子类的实例,它封装了所有业务特定的JTable 需求和定制.例如,自定义单元格渲染器。
    猜你喜欢
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    相关资源
    最近更新 更多