修改思路
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);