2012-03-10 25 views
1

好吧,我一直在嘗試這個過去的露點時間,它變得毫無希望。在JTable裏的一列中着色一個特定的單元格

所以我想應用單元格渲染到第二列。

stockTable.setCellRender(jtSpread.getColumnModel().getColumn(1)); 

調用的方法是setCellRender其具有以下的代碼:

public void setCellRender(TableColumn column) 
{ 
    column.setCellRenderer(new cellRenderer(data, rows)); 
} 

我CellRenderer類具有下面的代碼:上述

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 

    for(int i = 0; i < rows; i++) { 
     if(row == i && column == 2) { 

     } 
    } 
    return this; 
} 

是不完整的,在一個完整的混亂。我的目標是檢查每個單元格是否有條件,如果是,那麼我會返回帶有綠色前景的標籤。如果爲false,則返回帶有紅色前景的標籤。我想要逐個檢查列中的每個細胞,每個細胞都是特定的。

編輯:關於每個細胞有自己的條件,例如。

第一個單元格的值爲600,我想檢查一個數組[0],如果array [0]的內容較高,我希望單元格爲綠色,否則爲紅色。

第二個單元格的值爲626,我想檢查一個數組[1],如果數組[1]的內容較高,我希望單元格爲綠色,否則爲紅色。

我想繼續在打擊所有值的列所有單元格數組中

+0

因此,每個單元的條件是不同的?在整個桌子上還是在整個列上? – 2012-03-10 21:22:23

+0

我剛剛更新了我的帖子: – 2012-03-10 21:57:06

+0

你的方法是錯誤的:渲染器只關心即將渲染的單元格。確保你瞭解這個概念,f.i.通過閱讀基本教程,如http://docs.oracle.com/javase/tutorial/uiswing/components/table.html – kleopatra 2012-03-11 15:08:31

回答

5

確保您的渲染延伸DefaultTableCellRenderer:

CellRenderer extends DefaultTableCellRenderer { 
    ... 

然後,getTableCellRendererComponent()可能是這樣的(這種方法被稱爲每個細胞呈現時間):

public Component getTableCellRendererComponent(JTable table, Object value, 
    boolean isSelected, boolean hasFocus, int row, int column) { 

    Component cellComponent = super.getTableCellRendererComponent(
      table, value, isSelected, hasFocus, row, column); 
    cellComponent.setForeground(isMyConditionFullfilled(value) ? Color.GREEN : Color.RED); 
    return cellComponent;  
} 
1

渲染類必須實現TableCellRender 嘗試THI在你的呈現類:

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     JLabel label = new JLabel(); 
     label.setOpaque(true); 
     if (value != null && value.equals("text")) { //Checking if cell´s values isnt null and the condition is true 
      label.setBackground(Color.GREEN); 
     }else{ 
      label.setBackground(Color.RED); 
     } 
     return label; 
    } 

渲染將通過自己的檢查每一個細胞,只要告訴它如何呈現每個單元格。變量「value」包含每行的值,因此您可以使用它來檢查條件。如果你的列有一個定義的類型,則轉換變量「value」。 例如,如果你的單元格有雙重類型定義:

double valDouble = (Double) value; 
if (value != null && value == 5.00) { //Checking if cell´s values isnt null and the condition is true 
     label.setBackground(Color.GREEN); 
}else{ 
     label.setBackground(Color.RED); 
    } 
+0

感謝您的幫助,請檢查我剛剛更新過的原始文章。我已經包含了我想爲每個單元執行的檢查,請檢查並告訴我是否有辦法容納此問題, – 2012-03-10 21:58:27

+1

修改原始文章並給出模糊評論以解釋其中一個問題是我們不能再告訴你剩下的問題是什麼。這些帖子都沒有回答你的問題嗎?他們以什麼方式不回答?我認爲在這個主題中再作一個答案會更好,所以讀者可以來看看你在原文中提到了a,b和c,他們回答了b和b的一部分,但是你正在尋找c ... – arcy 2012-03-10 23:09:35

+0

-1用於在每次調用渲染器時創建新的JLabel(即_often_)而是創建一次,fi在構造函數中,然後重新使用。 – kleopatra 2012-03-11 15:15:44

相關問題