在JTable中更改某些行的颜色但不是全部

时间:2012-07-27 08:44:05

标签: java swing jtable tablecellrenderer tablecelleditor

我已经创建了一个自定义单元格渲染器类来实现此目的。

public class MatchTableCellRenderer extends DefaultTableCellRenderer{


    public Component getTableCellRendererComponent (JTable table,
                                                    Object obj, boolean isSelected, boolean hasFocus, int row, int column) {
        Component cell;
        cell = super.getTableCellRendererComponent(
                table, obj, isSelected, hasFocus, row, column);
        if( ((String[]) ((MatchTableModel) table.getModel()).getRow(row)).length==7 ){
            System.out.println(((String[]) ((MatchTableModel) table.getModel()).getRow(row))[0]+" "+((String[]) ((MatchTableModel) table.getModel()).getRow(row))[6]);

            cell.setForeground(Color.green);

        }
        return cell;
    }


}

我已将此渲染器设置为由我的表格列使用:

    tempColumn = table.getColumnModel().getColumn(0);
    tempColumn.setCellEditor(new MacColumnEditor());
    tempColumn.setCellRenderer(new MatchTableCellRenderer());

    tempColumn = table.getColumnModel().getColumn(1);
    tempColumn.setCellEditor(new IpColumnEditor());
    tempColumn.setCellRenderer(new MatchTableCellRenderer());

    tempColumn = table.getColumnModel().getColumn(2);
    DefaultCellEditor dfEditor=new DefaultCellEditor(new JTextField());
    dfEditor.setClickCountToStart(2);
    tempColumn.setCellEditor(dfEditor);
    tempColumn.setCellRenderer(new MatchTableCellRenderer());

我希望包含长度= 7绿色的String []和其他具有默认颜色的行。但有趣的是我的所有行都变成了绿色。你可以看到我有一条印刷线。它打印了4次(我的桌子有12行),但所有的行都是绿色的,而不是4.我做错了什么?

2 个答案:

答案 0 :(得分:3)

您可以使用XxxCellRenderer,但更好,最简单的方法是使用prepareRenderer()

对于正确的代码,您必须覆盖或测试内部if-else跟随patameters

  • isSelected

  • hasFocus

有关similair问题的更多信息<{3}}和answers

答案 1 :(得分:3)

原因是DefaultTableCellEditor的臭名昭着的颜色内存(TM):您必须设置颜色始终,而不是仅在一个分支中。

if (myCondition) {
   setBackground(...) {
} else {
   setBackground(...) 
} 

具体细节在recent thread

中解释