2012-07-27 61 views
2

我已經創建了一個自定義單元格渲染器類來實現此目的。更改JTable中某些行的顏色但不是全部

public class MatchTableCellRenderer extends DefaultTableCellRenderer{ 


    public Component getTableCellRendererComponent (JTable table, 
                Object obj, boolean isSelected, boolean hasFocus, int row, int column) { 
     Component cell; 
     cell = super.getTableCellRendererComponent(
       table, obj, isSelected, hasFocus, row, column); 
     if(((String[]) ((MatchTableModel) table.getModel()).getRow(row)).length==7){ 
      System.out.println(((String[]) ((MatchTableModel) table.getModel()).getRow(row))[0]+" "+((String[]) ((MatchTableModel) table.getModel()).getRow(row))[6]); 

      cell.setForeground(Color.green); 

     } 
     return cell; 
    } 


} 

我也在此渲染到我的表中的列使用:

tempColumn = table.getColumnModel().getColumn(0); 
    tempColumn.setCellEditor(new MacColumnEditor()); 
    tempColumn.setCellRenderer(new MatchTableCellRenderer()); 

    tempColumn = table.getColumnModel().getColumn(1); 
    tempColumn.setCellEditor(new IpColumnEditor()); 
    tempColumn.setCellRenderer(new MatchTableCellRenderer()); 

    tempColumn = table.getColumnModel().getColumn(2); 
    DefaultCellEditor dfEditor=new DefaultCellEditor(new JTextField()); 
    dfEditor.setClickCountToStart(2); 
    tempColumn.setCellEditor(dfEditor); 
    tempColumn.setCellRenderer(new MatchTableCellRenderer()); 

我想它含有的String []長度= 7綠色行和其他有默認的顏色。但有趣的是,我所有的行都變成了綠色。你可以看到我有一條打印線。它被打印4次(我的桌子有12行),但所有的行都是綠色的,而不是4個。我做錯了什麼?

回答

3

原因是臭名昭著的色彩記憶DefaultTableCellEditor的(TM):你必須設置顏色總是,而不是隻在一個分支。

if (myCondition) { 
    setBackground(...) { 
} else { 
    setBackground(...) 
} 

的具體細節在recent thread

+0

你給我的線程幫了很多。謝謝。現在我還有一個問題。在表格排序後,我需要突出顯示才能正常工作:/ – Alptugay 2012-07-27 11:02:28

+2

convertRowIndexToModel(row) – kleopatra 2012-07-27 11:13:42

3

您可以使用XxxCellRenderer,但更好,最簡單的就是使用prepareRenderer()

爲正確的代碼,你必須內部覆蓋或測試的if-else如下patameters

  • isSelected

  • hasFocus

  • column

answers

越來越question約similair問題

+0

+1解釋爲'prepareRenderer' – MadProgrammer 2012-07-27 08:52:03

+0

@MadProgrammer prepareRenderer這樣是不是一個好主意,除非A)的亮點應該適用於一個完整的行b)設計良好的(有偏見的,可重複使用的)可插拔機制來完全控制組件的裝/什麼/如何裝飾 - 作爲fi在SwingX :-)基本規則是沒有子類的任何JSomething的應用程序的原因 – kleopatra 2012-07-27 10:29:38

+0

+1感謝您的答案。 prepareRenderer()幫助了我,但我達到了我想要的回答@kleopatra – Alptugay 2012-07-27 11:01:25