Изменение цвета ячейки JTable

Это сводит меня с ума.

Я знаю, что для изменения форматирования ячеек таблицы с помощью JTable мне нужно использовать собственный рендер. Но я не могу реализовать это должным образом.

Это моя текущая настройка:

public class MyClass
{
    public static void main(String args[])
    {
        JTable myTable = new JTable(10, 10);
        myTable.setDefaultRenderer ([I dont know what to put here], new CustomRenderer());
    }
}

class CustomRenderer extends DefaultTableCellRenderer 
{
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

        // Formatting
        return c;
    }
}

Что мне нужно использовать для первого параметра setDefaultRenderer? API просто говорит "класс". Понятия не имею, что там поставить.

Может ли кто-нибудь просто объяснить, в простейших терминах, как я реализую это? Пожалуйста, приведите пример того, как я могу изменить форматирование из main() метод также.

1 ответ

Решение

В первом параметре для setDefaultRenderer, поместите литерал класса для класса, который вы хотите переопределить рендеринг. Т.е. если ваши данные состоят из всех строк, вы можете поставить

myTable.setDefaultRenderer(String.class, new CustomRenderer());

Если ваши данные также состоят из значений с BigDecimal или же Integer как классы, вы должны вызывать этот метод несколько раз для каждого типа класса (BigDecimal.class или же Integer.class в каждом случае).

И, наконец, чтобы изменить цвет фона, вы делаете это в вашем рендерере:

class CustomRenderer extends DefaultTableCellRenderer 
{
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        c.setBackground(new java.awt.Color(255, 72, 72));
        return c;
    }
}

Если вы напишете средство визуализации, которое должно работать для всех классов интерфейса, вам также потребуется изменить getColumnClass функция вашей табличной модели и пусть она возвращает класс интерфейса для всех объектов, которые реализуют этот интерфейс:

public Class<? extends Object> getColumnClass(int c) {
    Object object = getValueAt(0, c);
    if(object == null) {
        return Object.class;
    if(getValueAt(0, c) instanceof IColorable) {
        return ICarPart.class;
    } else {
        return getValueAt(0, c).getClass();
    }
}

При этом можно зарегистрировать средство визуализации для IColorable.class и не нужно регистрировать отдельное средство визуализации для каждой реализации.

Другие вопросы по тегам