2010-05-06 42 views

回答

8

在你引用的代碼中,你有一個自定義的CellRenderer。

一旦你添加它到表中,所有你需要的是做格式在適當的地方:

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

     // Formatting here 

     return c; 
    } 
} 

一個DefaultTableCellRenderer無非是將JTable中所使用的成分多還是少,繪製細胞。更確切地說,在這種情況下,組件是一個JLabel(你可以通過檢查來自DefaultTableCellRenderer的源來看到這一點)。因此,所有你應該做的格式是在「c」對象上(或者在「this」上,因爲方法實際上每次都返回相同的組件:本身)。例如,c.setBackground()將允許您設置背景顏色。

被覆蓋的getTableCellRendererComponent()方法將爲JTable的每個單元調用,參數告訴你關於上下文的信息。你知道表,行,列,這是應該要顯示的值,如果選擇與否細胞,你也知道,這可能與你的情況下幫助:

if (selected) 
    c.setBackground(Color.YELLOW); 

要請進一步注意,因爲您重寫了DefaultTableCellRenderer類,並使用它自己的方法,所以您已經完成了一些格式化操作,例如背景顏色,它是表格中的一種。因此,您只需要在需要時定義自己的顏色。如果不是,則必須注意所有情況,因爲由於使用了相同的組件,您將以顏色集合結束一次,然後應用於所有連續的單元格,因爲沒有任何操作可以更改它。

如果您想了解更多關於它的完成和使用方式,我建議您閱讀DefaultTableCellRenderer(及其在JTable中的使用)的源代碼。

+0

謝謝!正是我需要的。我只是沒有想通過。 – pypmannetjies 2010-05-11 19:12:32

2

這是否意味着單元格顏色會永久更改,或者一旦單擊其他單元格就會重置它。

如果您只是想暫時改變顏色,那麼最簡單的方法就是使用Table Row Rendering中介紹的概念,這樣您就不必爲每種類型的數據創建多個渲染器。

如果您希望單元格顏色是永久性的,那麼它會涉及更多,因爲現在您實際上需要爲每個應該着色不同的單元格保存數據。再次,最簡單的方法是使用上面的方法,然後可能保留一組所有的彩色單元格。

0

當我想要爲JTable中的特定單元格着色時,我也很掙扎。 您可以創建自定義表格單元格渲染器,並將其作爲參數發送給行/列:

class CustomRenderer extends DefaultTableCellRenderer { 
    int col; 
    int row; 
    public CustomRenderer (int col, int row) 
    { 
     this.col = col; 
     this.row = row; 
    } 
    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); 

     setForeground((column == this.col && row == this.row) 
            ? Color.red : Color.black); 

     return c; 
    } 
} 

table.getColumnModel().getColumn(0).setCellRenderer(new CustomRenderer(0, 1); 
table.getColumnModel().getColumn(1).setCellRenderer(new CustomRenderer(1, 3);