最近做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背景颜色和文本的方法,有代码最好谢谢!

解决方案 »

  1.   

    问题解决了:cell的文本编辑的话,直接编辑JTable的Model(我用的是DefaultTableModel然后repaint() JTable,即可;
    对于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。
    谢谢大家。不过论坛好像很冷清哦!
      

  2.   

    楼主这个不知道想干嘛,TableModel之所以有getColumnClass()方法,是因为Swing的JTable里面一列就是一个类型,就像数据库表一样,一个列不允许出现不同的类型,否则显示的时候会强制将不属于该类型的值转换成该类型,JTable的很多效果正是通过getColumnClass()方法获取到的类来决定的,比如某一列getColumnClass()方法返回的是Boolean.class,就会用JCheckBox来作为该列的编辑器,而JTable的setDefaultRenderer()方法的作用是把所有getColumnClass()获取到的Class为指定Class的列的渲染器设为指定类型,所以从本质上来说,只是设置了列的渲染器而已,并不是单元格的渲染器,所以要达到楼主的“多个,不规则排布的单元格”的效果,依然还是没办法,只能在设置列的渲染器之后,再在渲染器内部的行上面作文章。
      

  3.   

    import javax.swing.*;
    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数组就行了