JTable从给定的ArrayList更改单元格颜色

时间:2014-05-30 10:28:40

标签: java swing colors jtable tablecellrenderer

所以我有以下类定义错误的基本参数

public class Error {

public String desc;
public int rowNumber;
public int colNumber;
public int fixNumber;

public Error(String desc,int row, int col, int fix){
    this.desc = desc;
    rowNumber = row++;
    colNumber = col++;
    fixNumber = fix;
}
...

我的gui班

public class Gui extends JFrame {

AbstractTableModel model;
JTable table; 

public void start(AbstractTableModel model) { 
    this.model = model;
    table=new JTable(model){
        @Override 
        public boolean isCellEditable(int arg0, int arg1) { 
            return false; 
        }

    }; 

    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);


    TableColumn column = null;
    for (int i = 0; i < model.getColumnCount(); i++) {
            column = table.getColumnModel().getColumn(i);
            column.setPreferredWidth(120);  
            column.setMaxWidth(300);
            column.setMinWidth(50);
            column.setCellRenderer(new customCellRender());
        }



        JScrollPane pane = new JScrollPane(table);  
        pane.setPreferredSize(new Dimension(900,900));
        add(pane); 
        setLayout(new FlowLayout());
        setDefaultCloseOperation(EXIT_ON_CLOSE); 
        pack();
        setVisible(true); 
}

我试图制作一个cellRenderer,但目前它没有预期的效果。因为它为所有细胞着色。

@SuppressWarnings("serial")
public class customCellRender extends DefaultTableCellRenderer  {

public Component getTableCellRendererComponent(JTable table, Object value, boolean     isSelected, boolean hasFocus, int row, int column){
    Component c = null;
    c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);   
    c.setBackground(new java.awt.Color(255, 72, 72));

     return c;
}

然后我有一个存储错误类实例的List。我不知道如何只根据Error(rowNumber,colNumber)更改表中单元格的颜色。考虑到错误是在列表结构中,所以我必须迭代并以某种方式将每个错误列和行传递给渲染器。这可能吗?

1 个答案:

答案 0 :(得分:1)

您的代码为所有单元格着色,因为该组件已重复使用,而不是每次都重新创建。只需添加一个

if (error) {
    c.setBackground(errorBackground);
} else {
    c.setBackground(table.getBackground);
}

要说几点:

  1. 每次都不要创建新的颜色。它很昂贵而且你还在使用同一个。
  2. 使用错误集来快速contains,否则你的渲染可能会变得非常慢而且有很多。