2009-05-03 8 views
7

Это сводит меня с ума.Изменение цвета 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().

ответ

13

В первом параметре для 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(); 
    } 
} 

Wi th, что можно зарегистрировать средство визуализации для IColorable.class и не нужно регистрировать отдельный рендеринг для каждой реализации.

+0

Это, похоже, не работает для меня. Единственное, что я сделал, это вызвать метод setDefaultRenderer и создать класс CustomRenderer. Есть ли что-то еще, что мне нужно сделать, чтобы заставить это работать? –

+2

Я получил его, используя Object.class вместо String.class. Не уверен, почему это было необходимо, потому что все мои данные были строками. Благодарим за помощь! –

+0

Мне не разрешено изменять рендеринг внутри слушателя? Я хочу переформатировать таблицу при нажатии кнопки. –

Смежные вопросы