2013-03-25 3 views
2

У меня есть Jtable, который заполняется из массива значений. Мой код выглядит так:Как изменить цвет целой строки JTable с определенным значением столбца

private static final String[] columnNames = {"Line Number", "Error","Fix Proposed","Percentage (%)"}; 
    static DefaultTableModel model = new DefaultTableModel(null,columnNames); 

    public static void DisplayMyJList(List<CaptureErrors> x,String extension, 
     ArrayList<Integer> l,ArrayList<Integer> p, 
     ArrayList<String> e,ArrayList<String> s) throws IOException {//Method to Dynamic get values to be populated in Jtable. 

    String theExtension = extension; 
    if(FILE_EXTENSION.equals("java")) { 
     for(CaptureErrors ex: x) { 

      Vector row = new Vector(); 
      row.add(ex.getLinenumber()); 
      row.add(ex.getMyfounderror()); 
      row.add(ex.getMycorrection()); 
      row.add(ex.getMyPercentage()+"%"); 

      model.addRow(row); 

      //model.setRowColour(1, Color.YELLOW); 
     } 
    } 

table = new JTable(model); 
    table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  
    table.setFillsViewportHeight(true); 
    table.setShowGrid(true); 
    table.setShowVerticalLines(true); 
    table.setGridColor(new Color(0,128,0)); 
    JTableHeader header = table.getTableHeader(); 
    table.setBackground(new Color(255,228,225)); 
    table.setEnabled(true); 
    header.setFont(new Font("Dialog", Font.CENTER_BASELINE, 12)); 
    header.setBackground(Color.black); 
    header.setForeground(Color.yellow); 
    JScrollPane pane4 = new JScrollPane(table); 

я могу заполнить JTable из массива значений с помощью JButton. Я хочу иметь условие, в котором, если в столбце «процент», получить все значения в этом столбце> 30, он выделяет строки color.red.

Я не хочу, чтобы пользователь TableCellRendererComponent. Я хочу, чтобы это действие выполнялось после нажатия кнопки Jbutton.

Действительное JTable выглядит следующим образом: enter image description here

Тогда согласно тому, что я хочу получить, первые 2 строки должны быть выделены красным цветом. Любая помощь оценивается.

+1

Ваша таблица обрабатывает все данные как строку. Вы действительно должны переопределить метод getColumnClass() ', чтобы вернуть правильный класс, чтобы каждый столбец мог быть отформатирован правильно. – camickr

ответ

5

Одной из проблем с API-интерфейсом рендеринга является то, что сложно создавать составные средства визуализации. Есть способы сделать, не поймите меня неправильно, но было бы неплохо, если бы это было встроено ... [end rant] ...

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

public class FilterRenderer extends DefaultTableCellRenderer { 
    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
     Double percent = (Double) table.getValueAt(row, 3); 
     // You'll need some way to supply the filter value, may via a centralised 
     // manager of some kind. 
     if (percent > 0.3 && !isSelected) { 
      setOpaque(true); 
      setBackground(Color.RED); 
     } else { 
      setOpaque(false); 
     } 
     return this; 
    } 
} 

public class OtherCellRenderer extends FilterRenderer { 
    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
     // Apply any special renderer requirements, like translating an object value to String 
     return this; 
    } 
} 

Вам нужен пользовательский визуализатор для каждого столбца (от вас, например, это 4) и применять каждый к колонку таблицы

TableColumnModel model = table.getColumnModel(); 
model.getColumn(0).setCellRenderer(new LineNumberRenderer()); 
model.getColumn(1).setCellRenderer(new ErrorRenederer()); 
model.getColumn(2).setCellRenderer(new FixProposedRenderer()); 
model.getColumn(3).setCellRenderer(new Percentage()); 

Или вы могли бы просто использовать SwingLabs JXTable, который имеет встроенную поддержку для подсветки строк

7

См. Подход в Table Row Rendering для решения без создания собственных средств визуализации.

Вы также можете проверить Table Format Renderers, чтобы вы могли легко форматировать процентную колонку.

+0

+1, * Row Rendering * может быть очень полезен, отличная статья. – tenorsax

4

Вы можете создать собственный рендеринг ячеек. В его реализации проверьте, составляет ли процентное значение> 30 для данной строки, а затем выделите эту ячейку.

Например:

class SomeRenderer 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); 

     if (isHighlightingEnabled){ 
      Integer percentage = (Integer) table.getValueAt(row, 3); 
      if (percentage > 30) 
       c.setBackground(Color.RED); 
     } 
     return c; 
    } 
} 

Вы можете включить/отключить эту логику рендеринга на действия, если это необходимо.

Для получения более подробной информации см. Using Custom Renderers.

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