2012-11-29 103 views
1

我创建了一个Jtable.This表由两列名称和时间戳组成。如果名字是“jane”,我想使行黄色。下面是该代码: -JTable CustomRenderer问题

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); 
     String name = table.getModel().getValueAt(row, 0).toString(); 

     if (name.trim().equals("jane")) { 
      c.setBackground(Color.YELLOW); 
     } 
     return c; 
    } 
} 

然而,而不是更改行的颜色以黄色为特定的名称,它正在改变每row.I的颜色正在设置表的数据如下

tableModelName = (DefaultTableModel)jTableName.getModel(); 

jTableName.setDefaultRenderer(Object.class,new CustomRenderer()); 

for(int i=0; i<records.size(); i++) 
     { 
      tableModelName.addRow(records.get(i));   

     } 

我做错了什么?

+1

确保在访问模型之前使用'table.convertRowIndexToModel()'和'table.convertColumnIndexToModel()'。否则,任何表格排序或列重新排序都会使您的代码失败。 –

+0

@JBNizet谢谢 – Addict

回答

4

如果名称不是“jane”,则需要else子句将背景颜色设置为除黄色之外的其他颜色。单个渲染器实例用于所有渲染,因此,一旦将该实例的颜色设置为黄色,它将保持黄色。

看看JTable的源代码,看看如何内置的渲染工作:

if (isSelected) { 
     setForeground(table.getSelectionForeground()); 
     super.setBackground(table.getSelectionBackground()); 
    } 
    else { 
     setForeground(table.getForeground()); 
     setBackground(table.getBackground()); 
    } 

这样做的一个简单的方法,你可以尝试继承JTable的和压倒一切的prepareRenderer。对于像这样影响整行的更改,这很方便,因此您可以为单个单元格使用自定义渲染器,并在prepareRenderer方法中调整所有渲染器的行。

+0

+1 [prepareRenderer](http://stackoverflow.com/a/6901508/714968) – mKorbel