欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java修改JTable单元格背景色

程序员文章站 2022-06-08 15:05:15
...

修改思路

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