2015-10-22 2 views
0

Я хочу изменить цвет строки JTable после нажатия кнопки. Я нашел много примеров, которые показывают, как инициировать таблицу с разными цветами строк, а также как изменить цвет при выборе строки. Однако, интересно, какой правильный способ изменить цвет при нажатии на JButton.Как изменить цвет строки JTable после нажатия кнопки

TableCellRenderer colorRenderer = new ColorRenderer(); 
table.setDefaultRenderer(String.class, colorRenderer); 

private class ColorRenderer extends DefaultTableCellRenderer { 

    private static final long serialVersionUID = 1L; 

    @Override 
    public Component getTableCellRendererComponent(
      JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
     if (hasFocus) { 
      setBackground(Color.cyan); 
     } else if (isSelected) { 
      setBackground(table.getSelectionBackground()); 
     } else { 
      setBackground(table.getBackground()); 
     } 
     return this; 
    } 
} 

ответ

1

Учитывая, что вы загружаете данные в JTable как:

public void fillTable(){ 
     List<String> columns = new ArrayList<String>(); 
     List<String[]> values = new ArrayList<String[]>(); 
     columns.add("col1"); 
     columns.add("col2"); 
     columns.add("col3"); 
     for (int i = 0; i < 100; i++) { 
      values.add(new String[] {"val"+i+" col1","val"+i+" col2","val"+i+" col3"}); 
     } 
     TableModel tableModel = new DefaultTableModel(values.toArray(new Object[][] {}), columns.toArray()); 
     tableName.setModel(tableModel); 
    } 

Затем вы можете использовать как этот класс, чтобы установить выводимого на JTable:

public class EvenOddRenderer implements TableCellRenderer { 

     public static final DefaultTableCellRenderer DEFAULT_RENDERER = new DefaultTableCellRenderer(); 

     public Component getTableCellRendererComponent(JTable table, Object value, 
       boolean isSelected, boolean hasFocus, int row, int column) { 
      DEFAULT_RENDERER.setHorizontalAlignment(JLabel.CENTER); 
      Component renderer = DEFAULT_RENDERER.getTableCellRendererComponent(
        table, value, isSelected, hasFocus, row, column); 
      ((JLabel) renderer).setOpaque(true); 
      Color foreground, background; 
      Color alternate = new Color(0xC0, 0xC0, 0xF0); 
      Color lightBlue = new Color(204, 204, 255); 

      if (isSelected) { 
       foreground = Color.black; 
       background = Color.gray; 
      } else { 
       if (row % 2 == 0) { 
        foreground = Color.black; 
        background = Color.white; 
       } else { 
        foreground = Color.black; 
        background = lightBlue; 
       } 
      } 
      renderer.setForeground(foreground); 
      renderer.setBackground(background); 
      return renderer; 
     } 
    } 

Как это:

TableCellRenderer renderer = new EvenOddRenderer(); 
    tableName.setDefaultRenderer(Object.class, renderer); 
    tableName.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 

JTable on load

Затем вы можете использовать setRowSelectionInterval() метод, чтобы выбрать любую строку:

 private void btn(java.awt.event.ActionEvent evt) { 
     int index = 0; 
     tableName.setRowSelectionInterval(index, index); 
    } 

Здесь вы выбираете первую строку в JTable

JTable after button click

В этом примере вы выбираете Color.gray as JTable выбор цвет

Вы можете его правильно изменить

+0

спасибо. Когда я применяю этот рендерер и загружаю данные, он говорит «Исключение в потоке» AWT-EventQueue-0 «java.lang.StackOverflowError». У вас есть идеи, почему это происходит? –

+0

для меня это работает, как вы загружаете данные? –

+0

Теперь это работает. Цвета изменяются при загрузке данных. Однако, когда я нажимаю кнопку, цвет строки не изменяется. Поэтому я предполагаю, что «isSelected» не передается визуализатору. –

0

Отъезд Table Row Rendering.

Этот подход также будет работать для таблиц, содержащих разные типы данных в каждом столбце, поэтому вам не нужно создавать собственные средства визуализации для каждого типа данных.

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