JTable DefaultCellRenderer не работает на BigDecimal Type, когда я устанавливаю Object.class - PullRequest
0 голосов
/ 22 марта 2011

Странно, что я установил свой рендерер ячеек 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", все поля String работают нормально.

А потом я добавляю еще одну строку:

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

Тогда все просто отлично работает. Почему это так?

Ответы [ 2 ]

3 голосов
/ 23 марта 2011

JTable по умолчанию устанавливает рендерер для типа Number. BigDecimal is-a Number, поэтому вместо настраиваемого средства визуализации используется средство визуализации по умолчанию.

Кстати: ваш пользовательский рендерер содержит ошибки, поскольку он не учитывает потенциально отсортированные / отфильтрованные строки (параметры индекса строки / столбца метода являются координатами представления).

@ eugener: ваш ответ неправильный - важен не объем памяти, а поиск; -)

Приветствие Жанетт

0 голосов
/ 23 марта 2011

Взгляните на исходный код JTable:

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

Используется карта, в которой класс столбца является ключом, и означает, что сравнение классов является литералом. Это должно объяснить причину поведения, которое вы испытываете. Это по замыслу.

...