2013-12-19 4 views
0

У меня есть JTable, и я хочу, чтобы результат в таблице имел строки, цвет которых соответствовал конкретному значению атрибута; comp является null здесь:Как покрасить строки JTable в соответствии с конкретным значением атрибута

private JNI18NTable _issueIncidentTable = new JNI18NTable(I18N_ID, COLUMNS, "issue.table.") { 
     public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { 
      Component comp = super.prepareRenderer(renderer, row, col); 

      int RangeIndex = Utilities.rowIndexToRangeIndex(_resultIter, row); 
      Row theRow = _resultIter.getRowAtRangeIndex(RangeIndex); 
      System.out.println("the row is" + theRow.getAttribute("Type")); 
      boolean markRow = theRow != null && theRow.getAttribute("Type").toString().equals("c"); 
      boolean isSelected = isRowSelected(row); 
      System.out.println("the comp" + comp); 
      if (markRow) { 
       comp.setForeground(Color.white); 
       comp.setBackground(isRowSelected(row) ? Color.red.darker() : Color.red); 
      } else { 
       comp.setForeground(isSelected ? getSelectionForeground() : getForeground()); 
       comp.setBackground(isSelected ? getSelectionBackground() : getBackground()); 
      } 
      return comp; 
     } 
    }; 

ответ

2

Экстраполируя sscce, ваша реализация prepareRenderer(), кажется, работает, как показано ниже. Вы можете посмотреть в другом месте вашего кода на предполагаемую проблему. В частности, реализация Utilities.rowIndexToRangeIndex() должна, вероятно, использовать собственный метод таблицы . Кроме того, используйте значение isSelected последовательно.

image

import java.awt.Color; 
import java.awt.Component; 
import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableCellRenderer; 

/** 
* @see http://stackoverflow.com/a/20684058/230513 
*/ 
public class Test { 

    private void display() { 
     JFrame f = new JFrame("Test"); 
     JTable table = new JTable(new DefaultTableModel(10, 1) { 

      @Override 
      public Object getValueAt(int row, int col) { 
       return "Row " + row; 
      } 
     }) { 
      @Override 
      public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { 
       Component comp = super.prepareRenderer(renderer, row, col); 

       boolean isSelected = isRowSelected(row); 
       if (row % 2 == 0) { 
        comp.setForeground(Color.white); 
        comp.setBackground(isSelected ? Color.red.darker() : Color.red); 
       } else { 
        comp.setForeground(isSelected ? getSelectionForeground() : getForeground()); 
        comp.setBackground(isSelected ? getSelectionBackground() : getBackground()); 
       } 
       return comp; 
      } 
     }; 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new JScrollPane(table)); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Test().display(); 
      } 
     }); 
    } 
} 
+0

Но комп становится нулевым снова и снова, что проблема здесь. –

+0

Я получаю исключение нулевого указателя. –

+0

Пожалуйста, отредактируйте свой вопрос, чтобы включить трассировку [sscce] (http://sscce.org/) и стек, в которой представлена ​​проблема, которую вы описываете. – trashgod

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