2016-05-28 4 views
1

В моей программе Java у меня возникла проблема с настройкой цвета ячейки таблицы. Как вы видите ниже, у меня есть 4 разных компонента столбца в ячейках. И когда я меняю цвета всех этих ячеек, меняет цвет колонки.Различные изменения при изменении цвета ячеек JTable

DefaultTableModel tableModel = new DefaultTableModel(columns,0){ 
    @Override 
    public Class<?> getColumnClass(int column) { 
     switch(column) { 
      case 0: return String.class; 
      case 1: return ImageIcon.class; 
      case 2: return Integer.class; 
      case 3: return Integer.class; 
      default: return Object.class; 
     } 
    } 
}; 

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

table1.setDefaultRenderer(Object.class, new ColorChange); 
// I guess Object.class causes the problem 
public class ColorChange implements TableCellRenderer { 

    public final DefaultTableCellRenderer DEFAULT_RENDERER = new DefaultTableCellRenderer(); 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, 
                boolean isSelected, boolean hasFocus, int row, int column) { 
     Component c = DEFAULT_RENDERER.getTableCellRendererComponent(table, 
       value, isSelected, hasFocus, row, column); 

     // Apply zebra style on table rows 
     if (row % 2 == 0) { 
      c.setBackground(Color.WHITE); 
     } else { 
      c.setBackground(Color.decode("#F8F8F8")); 
     } 

     return c; 
    } 

} 

Поэтому вопрос состоит в том, что как я могу изменить цвет всех столбцов?

Заранее спасибо.

+1

'if (row% 2 == 0) { c.setBackground (Color.WHITE);' Nimbus PLAF предоставляет строки таблицы альтернативными цветами (автоматически). –

ответ

3

Как вы видите ниже, у меня есть 4 различных компонента колонки в ячейках. И когда я меняю цвета всех этих ячеек, меняется только цвет колокола.

table1.setDefaultRenderer(Object.class, new ColorChange); 

Отображатель используется только для класса, указанного. Object.class задан как класс catch для классов, не имеющих конкретного средства визуализации.

В вашем случае он будет использоваться только для String объектов. Классы Icon и Integer уже имеют собственный рендерер.

Вы также мог бы добавить:

table1.setDefaultRenderer(Icon.class, new ColorChange); 
table1.setDefaultRenderer(Integer.class, new ColorChange); 

Однако, если вы сделаете это, вы потеряете пользовательское форматирование этих рендеров. Если вы хотите продолжить этот подход, вам понадобится средство «IconColorChange» и «IntegerColorChange».

Вместо этого я предлагаю вам проверить Table Row Rendering для решения, которое позволит вам выполнять раскраску на уровне строк при использовании пользовательского форматирования рендеринга или таблицы. Это не нужно создавать пользовательский рендерер.

+0

Вау! оно работает. Благодаря :) – lincinthesink