2015-05-22 61 views
3

我遇到了一個小問題,並且正在努力解決它。基本上,發生的事情是我有一個JTable,這個JTable被一個從API調用中獲得的數組填充。
我目前擁有的是,如果一個設備顯示爲在線,它將改變綠色,如果離線,然後是淺灰色。
問題是它影響整個ROW而不僅僅是CELL的狀態。我只想讓狀態單元突出顯示綠色。任何幫助將非常感激。調整JTable中的一個單元而不是整行

custTable = new javax.swing.JTable(model){ 

@Override 
public Component prepareRenderer(TableCellRenderer renderer, int rowIndex, 
    int columnIndex) { 
    JComponent component = (JComponent) super.prepareRenderer(renderer, rowIndex, columnIndex); 

    if(getValueAt(rowIndex,1).toString().equalsIgnoreCase("Online")) 
    { 
     component.setBackground(Color.GREEN); 
    } 
    else if(getValueAt(rowIndex,1).toString().equalsIgnoreCase("Offline")) 
    { 
     component.setBackground(Color.lightGray); 
    } 

    return component; 
} 

Screenshot

+1

檢查和糾正columnIndex你的代碼。 –

回答

4

不要覆蓋prepareRenderer()方法。通常,只有當您希望渲染對輸入行有效時纔會覆蓋此方法。此方法非常有用,因爲呈現代碼位於同一位置,您不必爲表中的每個列創建自定義呈示器。

但是,對於特定列中的單元格的特定渲染,您應該爲該列創建自定義渲染器。

閱讀Swing教程Using Custom Renderers中的部分以獲取更多信息和示例。

本教程示例實現TableCellRenderer接口。這可能是更容易擴展的默認渲染:

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

     if (!isSelected) 
     { 
      int viewColumn = convertColumnIndexToView(1) 
      String value = getModel().getValueAt(rowIndex, viewColumn).toString(); 

      if ("Online".equalsIgnoreCase(value)) 
       setBackground(Color.GREEN); 
      else 
       setBackground(Color.lightgray); 

      return this; 
     } 
    } 
} 

注意你應該轉換的情況下,列索引的用戶重新排序表中的列。

+0

正是我需要的。我回顧了你的鏈接指南以及你的代碼片段,它讓我到了我需要的地方。非常感謝你camickr。 – basic

2

我同意camickr,但你也可以如下避免你的問題的TableCellRenderer

@Override 
public Component prepareRenderer(TableCellRenderer renderer, int rowIndex, 
    int columnIndex) { 
    JComponent component = (JComponent) super.prepareRenderer(renderer, rowIndex, columnIndex); 

    if(getValueAt(rowIndex,1).toString().equalsIgnoreCase("Online") && columnIndex == 1) 
    { 
     component.setBackground(Color.GREEN); 
    } 
    else if(getValueAt(rowIndex,1).toString().equalsIgnoreCase("Offline") && columnIndex == 1) 
    { 
     component.setBackground(Color.lightGray); 
    } else { 
     component.setBackground(isRowSelected(rowIndex)? getSelectedBackground() : getBackground()); 
    } 

    return component; 
} 
相關問題