最近做java界面,用JTable,需要编辑里面单个Cell:设置文本,设置颜色(多个,不规则排布的CEll)。在网上参考了一下代码,实现个方法修改颜色的功能,但都是一修改就修改了一列,或者只能修改某列中的一个,代码如下:public void setCellColor(JTable table, final int rowID,final int columnID,final Color colorChange){
DefaultTableCellRenderer tcr = new DefaultTableCellRenderer() {
private static final long serialVersionUID = 1L;
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
Component cell = super.getTableCellRendererComponent
(table, value, isSelected, hasFocus, row, column);
if(row==rowID && column==columnID && cell.isBackgroundSet()){
cell.setBackground(colorChange); }
else cell.setBackground(Color.white);
return cell;
}
};
table.getColumnModel().getColumn(columnID).setCellRenderer(tcr);
table.repaint();
}请教实现可以修改任意多个cell背景颜色和文本的方法,有代码最好谢谢!
DefaultTableCellRenderer tcr = new DefaultTableCellRenderer() {
private static final long serialVersionUID = 1L;
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
Component cell = super.getTableCellRendererComponent
(table, value, isSelected, hasFocus, row, column);
if(row==rowID && column==columnID && cell.isBackgroundSet()){
cell.setBackground(colorChange); }
else cell.setBackground(Color.white);
return cell;
}
};
table.getColumnModel().getColumn(columnID).setCellRenderer(tcr);
table.repaint();
}请教实现可以修改任意多个cell背景颜色和文本的方法,有代码最好谢谢!
对于cell背景色的,需要重写AbstractTableModel,例如
private class MyTableModel extends AbstractTableModel
{
String[] head= {"Object","Number","Boolean","Icon","Color"};
//创建初始表格数据
Object[][] data=
{{"这里是字符串1",new Integer(20),new Boolean(true),
new ImageIcon("D:/p1.gif "),Color.black},
{"这里是字符串2",new Double(12.34),new Boolean(false),
new ImageIcon("D:/p2.gif "),Color.darkGray},
{"这里是字符串3",new Integer(125),new Boolean(true),
new ImageIcon("D:/p3.gif"),Color.white}};
private static final long serialVersionUID = 1L;
//创建表示各个列类型的类型数组
Class[] typeArray=
{Object.class,Double.class,Boolean.class,Icon.class,Color.class};//这里是关键
//重写getColumnCount方法
public int getColumnCount()
{
return head.length;
}
//重写getRowCount方法
public int getRowCount()
{
return data.length;
}
//重写getColumnName方法
public String getColumnName(int col)
{
return head[col];
}
//重写getValueAt方法
public Object getValueAt(int r,int c)
{
return data[r][c];
}
//重写getColumnClass方法,是关键
public Class getColumnClass(int c)
{
return typeArray[c];
}
//重写isCellEditable方法
public boolean isCellEditable(int r,int c)
{
return true;
}
//重写setValueAt方法
public void setValueAt(Object value,int r,int c)
{
data[r][c]=value;
this.fireTableCellUpdated(r,c);
}
}然后重写 TableCellRenderer接口:
private class MyCellRendererForColorClass
extends JLabel implements TableCellRenderer
{
private static final long serialVersionUID = 1L;
//定义构造器
public MyCellRendererForColorClass ()
{
//设置标签为不透明状态
this.setOpaque(true);
//设置标签的文本对齐方式为居中
this.setHorizontalAlignment(JLabel.CENTER);
}
//实现获取呈现控件的getTableCellRendererComponent方法
public Component getTableCellRendererComponent(JTable table,Object value,
boolean isSelected,boolean hasFocus,int row,int column)
{
//获取要呈现的颜色
Color c=(Color)value;
//根据参数value设置背景色
this.setBackground(c);
//设置前景色为背景色反色
//this.setForeground(new Color(255-c.getRed()
//,255-c.getGreen(),255-c.getBlue()));
//设置标签中显示RGB的值
//this.setText("["+c.getRed()+","+c.getGreen()+","+c.getBlue()+"]");
//将自己返回
return this;
}
} 实际操作的时候,先要定义一个MyCellRendererForColorClass对象crc,然后设置自己想改变cell的颜色,通过MyTableModel(属于JTable的Model)的对象.setValueat(Color.color,row,column)来设置,最后把crc通过.setDefaultRenderer(Color.class,mcr)设置给JTable。
谢谢大家。不过论坛好像很冷清哦!
import javax.swing.table.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;public class Test {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(800, 600);
final JTable table = new JTable(20, 5);
changeTableCellColor(table);
JButton btn = new JButton("随机改变单元格颜色");
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
changeTableCellColor(table);
}
});
frame.add(new JScrollPane(table));
frame.add(btn, BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
} private static void changeTableCellColor(JTable table) {
Random r = new Random();
int rowCount = table.getRowCount();
int colCount = table.getColumnCount();
int length = r.nextInt(rowCount * colCount);
int[] rows = new int[length];
for (int i = 0; i < rows.length; i++) {
rows[i] = r.nextInt(rowCount);
}
int[] cols = new int[length];
for (int i = 0; i < cols.length; i++) {
cols[i] = r.nextInt(colCount);
}
TableModel model = table.getModel();
Set<Class> classes = new HashSet<Class>();
for (int i = 0; i < colCount; i++) {
classes.add(model.getColumnClass(i));
}
TableCellRenderer renderer = new MyTableCellRenderer(rows, cols);
for (Class clazz : classes) {
table.setDefaultRenderer(clazz, renderer);
}
table.updateUI();
} private static class MyTableCellRenderer extends JLabel implements TableCellRenderer {
private int[] rows;
private int[] cols; public MyTableCellRenderer (int[] rows, int[] cols) {
this.rows = rows;
this.cols = cols;
setOpaque(true);
} public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
setBackground(Color.WHITE);
for (int i = 0; i < rows.length; i++) {
if (rows[i] == row && cols[i] == column) {
setBackground(Color.RED);
}
}
return this;
}
}
}这个楼主可以看一下,基本可以达到随机效果,只要TableCellRenderer构造方法传进去两个int数组就行了