Изменение цвета ячейки JTable - PullRequest
7 голосов
/ 04 мая 2009

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

Я знаю, что для изменения форматирования ячеек таблицы с помощью 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 Ответ

13 голосов
/ 04 мая 2009

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

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 и не нужно регистрировать отдельное средство визуализации для каждой реализации.

...