2013-03-25 79 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); 

我可以通過使用一個JButton從值的陣列填充的JTable。 我想有一個條件,如果列「百分比」,獲取此列中的所有值> 30,它將行突出顯示爲color.red。

我不想用戶TableCellRendererComponent。我想要這個動作在點擊Jbutton時執行。

實際的JTable看起來是這樣的: enter image description here

然後按照我想要得到的,第一個2行應該以紅色突出顯示。任何幫助讚賞。

+1

您的表格將所有數據視爲字符串。你應該重寫'getColumnClass()'方法來返回正確的類,以便每列可以正確格式化。 – camickr 2013-03-25 05:16:14

回答

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,*表格行渲染*可以是非常有用的,偉大的文章。 – tenorsax 2013-03-25 05:28:44

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