在本例中,每个单元格的颜色随机生成。同时,为了能够在颜色背景上显示数据,实现了一个Color类的子类MyObject。该类封装了单元格颜色和显示内容。在TableCellRenderer中可以利用该类对象设置颜色,同时又能够显示内容。
import java.awt.Color;
import java.awt.Component;
import javax.swing.*;
import javax.swing.table.*;
class MyObject extends Color{
private String value;
MyObject(int r,int g,int b,String value){
super(r,g,b);
this.value=value;
}
public Color getColor(){
return new Color(getRed(),getGreen(),getBlue());
}
public String toString(){
return value;
}
}
class MyTableCellRenderer extends JPanel implements TableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,boolean hasFocus, int row, int column){
setBackground((Color)value);
removeAll();
add(new JLabel(value.toString()));
return this;
}
}
class MyTableModel extends AbstractTableModel {
private Object[][] cells;
private String[] columnNames;
@Override
public String getColumnName(int col) {
return columnNames[col];
}
@Override
public Class getColumnClass(int col) {
return cells[0][col].getClass();
}
public int getColumnCount() {
return cells[0].length;
}
public int getRowCount() {
return cells.length;
}
public Object getValueAt(int row, int col) {
return cells[row][col];
}
@Override
public void setValueAt(Object obj, int row, int col) {
cells[row][col] = obj;
}
public MyTableModel(int rows, int cols, String[] columnNames) {
cells = new Object[rows][cols];
this.columnNames = columnNames;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
cells[i][j] = new java.awt.Color(255, 255, 255);
}
}
}
}
class ColoredTable{
private int columnCount=10;
private int rowCount=50;
private MyTableModel tableModel2;
private JTable table;
String[] columnNames2=new String[columnCount];
public void go(){
JFrame f=new JFrame("具有不同颜色单元格的JTable实例");
f.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
table=new JTable();
for(int i=0;i<columnCount;i++)
columnNames2[i]=""+i;
tableModel2=new MyTableModel(rowCount,columnCount,columnNames2);
table.setModel(tableModel2);
table.setDefaultRenderer(java.awt.Color.class, new MyTableCellRenderer());
table.setRowHeight(50);
for(int i=0;i<rowCount;i++)
for(int j=0;j<columnCount;j++){
int r=(int)(Math.random()*255);
int g=(int)(Math.random()*255);
int b=(int)(Math.random()*255);
Color color=new Color(r,g,b);
tableModel2.setValueAt(new MyObject(r,g,b,""+i+","+j),i,j);
}
f.add(new JScrollPane(table));
f.pack();
f.setVisible(true);
}
public static void main(String args[]){
new ColoredTable().go();
}
}