2011-11-15 37 views
3

我有這樣的代碼在我的表模型:JTable行顏色取決於模型中的值?

public class DocumentProjectTableModel extends AbstractTableModel{ 

    private List<MyDocument> myDocuments; 
    public String getValueAt(int row, int column) { 
      String toReturn = null; 
      MyDocument myDocument = myDocuments.get(row); 
      SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy"); 

      switch (column) { 
       case 0: 
        if(myDocument.getProject().getRegDate()!=null) toReturn = format.format(myDocument.getProject().getRegDate()); 
        break; 
       case 1: 
        toReturn = myDocument.getProject().getRegNum(); 
        break; 
       case 2: 
        toReturn = myDocument.getProject().getDescription(); 
        break; 
       case 3: 
        toReturn = myDocument.getProject().getShortName(); 
        break; 
       case 4: 
        toReturn = myDocument.getProject().getSecondName()+myDocument.getProject().getFirstName()+myDocument.getProject().getMiddleName(); 
        break; 

      } 
      return toReturn; 
     } 
// some other stuff is not shown 

我想改變每一行的背景顏色,例如,如果myDocument.getIsRegistered() == true,我希望此行有黃色的背景下,如果myDocument.getIsValid == false行藍色等。

我發現了一些示例,它們根據JTable中的值重新着色行。但getIsValid和getIsRegistered()實際上並不顯示,它們只存在於模型中。任何建議或例子都會有幫助。提前致謝。

更新。我的TableCellRenderer:

public class MyTableCellRenderer extends JLabel implements TableCellRenderer { 

    public Component getTableCellRendererComponent(JTable table, Object value, 
      boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) { 
     String actualValue = (String) value; 
     // Set the colors as per the value in the cell... 
     if(actualValue.equals("lifesucks")){ 
      setBackground(Color.YELLOW); 
     } 
     return this; 
    } 
} 

使用渲染:

  int vColIndex = 0; 
      TableColumn col = resultTable.getColumnModel().getColumn(vColIndex); 
      col.setCellRenderer(new MyTableCellRenderer()); 
resultTable.setModel(new DocumentProjectTableModel(docs)); 

表所示像往常一樣沒有黃色。爲什麼?

update2。

resultTable=new JTable(new DocumentProjectTableModel(docs)){ 
      public Component prepareRenderer(TableCellRenderer renderer, int row, int column) 
      { 
       Component c = super.prepareRenderer(renderer, row, column); 
       // Color row based on a cell value 
       if (!isRowSelected(row)) { 
        c.setBackground(getBackground()); 
        int modelRow = convertRowIndexToModel(row); 
        String type = (String) getModel().getValueAt(modelRow, 0); 

         c.setBackground(Color.GREEN); 
       } 
       return c; 
      } 
     }; 

表是空的:(

+1

很可能你的渲染器沒有被使用 - 它是按列設置的,然後設置模型。通過默認列在setModel上重新創建(或接收一個structureChanged),從而失去所有配置 – kleopatra

+0

謝謝指出。但是當我打電話給渲染器? – bunnyjesse112

回答

5

由於您想爲整行着色,因此使用Table Row Rendering比創建多個自定義渲染器更容易。

我發現了根據JTable中的值重新着色行的示例。但getIsValid和getIsRegistered()實際上並沒有顯示出來,他們只在模型

存在你仍然可以從表訪問模式。你只需要使用:

table.getModel().getValueAt(...); 
+1

對於所有單元格和行,您始終可以使用相同的渲染器。您可以使用給定的行和列號+放置在JTable後面的模型僅使用一個渲染器來演示如何渲染單元格或整行。 – GETah

+2

@GETah,當列包含不同類型的數據時,對每一行/列使用相同的渲染器不是一個好主意。該表已經有代碼來確定爲每個列使用哪個呈現器。您不應該在自定義渲染器中複製代碼。 – camickr

+1

@GETah - 雖然可能它不是通常的設置 – kleopatra

1

你必須寫自己的單元格渲染器:

http://www.exampledepot.com/egs/javax.swing.table/CustRend.html

+0

感謝您的回答。但是你提供的鏈接根據Jtable的值來解釋改變顏色。我需要根據模型中未顯示的值更改顏色。你能舉個例子嗎?謝謝 – bunnyjesse112

+1

該值實際上是從模型中檢索的,只要確保將模型綁定到JTable即可。 JTable將爲您檢索該值,因此無需爲此而煩惱。 – GETah

+1

您可以使用JTable的convertRowIndexToModel()來獲取行的模型索引。使用模型索引,您可以查詢相關數據的表格模型並決定顏色。 –

1

你需要實現一個自定義單元格渲染器這是一個良好的開端: 編輯:代碼更新

public class MyCellRenderer extends JLabel implements TableCellRenderer { 
    public Component getTableCellRendererComponent(JTable table, Object value, 
      boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) { 
     DocumentProjectTableModel mymodel = (DocumentProjectTableMode) table.getModel(); 
     MyDocument actualValue = (MyDocument) mydocumentModel.getDocument(rowIndex) ; 
     // Set the colors as per the value in the cell... 
     if(myDocument.getIsRegistered() == ...){ 
      setBackground(Color.YELLOW); 
     }// and so on...   
     return this; 
    } 
} 

這樣設置所有列的渲染器:

resultTable.setDefaultRenderer(MyColumnType.class, new MyCellRenderer()); 

我希望這會有所幫助。

+0

請看最新的問題。謝謝 – bunnyjesse112

+1

剛剛編輯我的答案,請看看它,讓我知道結果 – GETah

+1

將突出顯示錯誤的行,如果表排序 – kleopatra