Java修改JTable单元格背景色

修改思路

JTable单元格的渲染都通过TableCellRenderer这个接口进行,因此最合适的方式是通过继承默认的DefaultTableCellRenderer类并添加自己想要的功能。

通过查看代码可以发现,TableCellRenderer这个接口里只有如下一个方法

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

该方法传入的value参数就是JTable或TableModel的getValueAt方法返回的值

public Object getValueAt(int row, int column)

为了能自由的控制单元格的背景色和前景色,我打算把颜色信息放到value参数中,因此我自定义了一个类型

import java.awt.*;

abstract public class ColoredValue<T> { 

    private T value;

    public ColoredValue(T value) { 
        this.value = value;
    }

    public T getValue() { 
        return value;
    }

    abstract public Color getBgColor();
}

ColoredValue这个类型就两个方法,getValue是用来获取里面储存的值,当然,通过实现toString方法也可以,反正最后都要转成String填在表格里面。getBgColor是用来获取该值需要的背景色。这样一来,我们只需要把值和颜色信息都存入ColoredValue对象,那么就可以在getTableCellRendererComponent方法调用时得到颜色信息。

完整代码实现

ColoredValue类

import java.awt.*;

abstract public class ColoredValue<T> { 

    private T value;

    public ColoredValue(T value) { 
        this.value = value;
    }

    public T getValue() { 
        return value;
    }

    abstract public Color getBgColor();
}

ColoredStringValue类

import java.awt.*;

public class ColoredStringValue extends ColoredValue<String>{ 

    private boolean colored;

    public ColoredStringValue(String s, boolean colored) { 
        super(s);
        this.colored = colored;
    }

    @Override
    public Color getBgColor(){ 
        if (colored){ 
            return Color.RED;
        }else{ 
            return Color.WHITE;
        }
    }
}

MCellRenderer类

import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import java.awt.*;

public class MCellRenderer extends DefaultTableCellRenderer { 

    public static final DefaultTableCellRenderer DEFAULT_RENDERER = new DefaultTableCellRenderer();

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
        Component component = super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column);

        if(value instanceof ColoredValue) { 
            ColoredValue v =(ColoredValue)value;
            component.setBackground(v.getBgColor());
            setValue(v.getValue());  //将值填入,如果ColoredValue有toString方法则无需这么做
        }else { 
            component.setBackground(Color.WHITE);
        }

        return component;
    }

JTable代码

// 表头(列名)
            String[] columnNames = { "序号","报送日期","期号","标题","科室","拟稿人","备注"};

            // 设置滚动面板视口大小(超过该大小的行数据,需要拖动滚动条才能看到)
            //table.setSize(new Dimension(0, 600));
            // 创建滚动面板,把 表格 放到 滚动面板 中(表头将自动添加到滚动面板顶部)
            tmodel = new DefaultTableModel(columnNames, 0){ 
                @Override
                public boolean isCellEditable(int row, int column) { 
                    if (column==1 || (column>7 && column<18)){ 
                        return true;
                    }
                    return false;
                }
            };

            mainTable = new TempTable();
            mainTable.setModel(tmodel);
            mainTable.setDefaultRenderer(Object.class, new MCellRenderer()); //主要就是这行
            mainTable.setSelectionMode(SINGLE_SELECTION);

            //表格的列模型
            TableColumnModel cm = mainTable.getColumnModel();
            //设置列宽
            cm.getColumn(0).setPreferredWidth(30);
            cm.getColumn(1).setPreferredWidth(80);
            cm.getColumn(2).setMinWidth(100);
            cm.getColumn(3).setPreferredWidth(30);
            cm.getColumn(4).setMinWidth(100);

            // 把 表头 添加到容器顶部(使用普通的中间容器添加表格时,表头 和 内容 需要分开添加)
            tablePanel.add(mainTable,BorderLayout.CENTER);
            tablePanel.add(mainTable.getTableHeader(), BorderLayout.NORTH);
    原文作者:liucc09
    原文地址: https://blog.csdn.net/liucc09/article/details/95590344
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞