0

奇怪的是,我这样设置 JTable 单元格渲染器:

setDefaultRenderer(Object.class, new MyTableRenderer());

我的表格渲染器是这样工作的:

class MyTableRenderer extends DefaultTableCellRenderer {
    public Component getTableCellRendererComponent(JTable table, Object value,
                    boolean isSelected, boolean hasFocus, int row, int column) {
        Component comp = super.getTableCellRendererComponent(table, value,
                                            isSelected, hasFocus, row, column);
        Font font = comp.getFont();

        if (table.getModel().getValueAt(row, 0).equals(BUY)) {
            comp.setFont(font.deriveFont(Font.BOLD));
            comp.setForeground(BUY_COLOR);
        }
        else {
            comp.setFont(font.deriveFont(Font.BOLD));
            comp.setForeground(SELL_COLOR);
        }
        return comp;
    }
}

但事实证明,它没有应用那些类型为“BigDecimal”的列,其他字符串字段都工作正常。

然后,我再添加一行:

setDefaultRenderer(BigDecimal.class, new MyTableRenderer());

然后一切正常。为什么会这样?

4

2 回答 2

3

JTable 默认为 Number 类型安装一个渲染器。BigDecimal 是一个数字,因此使用默认渲染器而不是您的自定义渲染器。

顺便说一句:您的自定义渲染器有问题,因为它没有考虑潜在的排序/过滤行(该方法的行/列索引参数是视图坐标)。

@eugener:您的答案是错误的-重要的不是存储,而是查找;-)

干杯珍妮特

于 2011-03-23T12:43:01.493 回答
0

看一下源代码JTable

public void setDefaultRenderer(Class<?> columnClass, TableCellRenderer renderer) {
  if (renderer != null) {
      defaultRenderersByColumnClass.put(columnClass, renderer);
  } else {
      defaultRenderersByColumnClass.remove(columnClass);
  } 
}

它使用列类作为键的映射,这意味着类比较是字面的。这应该可以解释您遇到的行为的原因。这是设计使然。

于 2011-03-22T22:24:34.063 回答