已经困扰我整个下午了,特来请教各位大虾。我要实现的效果是,凡是被用户修改过JTable单元格里的内容,都呈现指定的颜色。整个程序有一个bug,如果用户修改的单元格在1个以上,那么当鼠标单击原来被修改过的单元格时,字体就被修改成了黑色,这是我非常不希望看到的。(我只有20分了,所以只能给20分......)
代码如下:
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.util.*;
import javax.swing.event.*;public class JTableForeground extends JFrame{
    private JTable table=new JTable();
    private DefaultTableModel model=new DefaultTableModel();
    private  String data[][]={  //为了方便提问,临时建立一个变量来显示表中数据,实际情况是从数据库的表中读取的数据
                 {"李振海","男","1988年3月3日","本科"},
                 {"张鑫","男","1982年7月29日","本科"},
                 {"李莉莉","女","1987年12月2日","硕士"},
                 {"戴友诚","男","1973年2月12日","大专"},
                 {"唐信","男","1977年9月20日","大专"}
             };
    private String fields[]={"姓名","性别","出生日期","学历"};
    private ArrayList<Point> tableChangedSets=new ArrayList<Point>(); //记录下所有被用户改变值的彼此不相同的单元格位置(几行几列)
                                            //用户完全可能对同一个单元格进行反复修改,被反复修改的单元格不作为新的Point被系统记录
    public static void main(String[] args){
        new JTableForeground();
    }
    private JTableForeground(){
        setSize(600,300);
        setLocation(300,300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        initTable();
        getContentPane().add(new JScrollPane(table));
        setVisible(true);
    }
    private void initTable(){
        table.setModel(model);
        model.setDataVector(data, fields);
        model.addTableModelListener(new TableModelListener(){ //设置所改变的值为亮灰色
            public void tableChanged(TableModelEvent e){
                int x=e.getFirstRow();
                int y=e.getColumn();
                
                if(x!=-1&&y!=-1&&(!table.getValueAt(x, y).equals(data[x][y]))){ //判断用户是否修改了单元格里的值
                    Boolean has=false; //由用户新产生的Point是否已经存在于tableChangedSets中,这里假设不存在,
                                      //是否存在需经下一个语句来确定。
                    if(!tableChangedSets.isEmpty()){
                        for(int i=0,pointX,pointY;i<tableChangedSets.size();i++){
                            pointX=tableChangedSets.get(i).x;
                            pointY=tableChangedSets.get(i).y;
                            if(x==pointX&&y==pointY) {has=true;break;}
                        }
                    }
                    if(!has) tableChangedSets.add(new Point(x,y)); //如果新编辑的单元格没有记录就添加这个新的单元格
                    
                    
                    DefaultTableCellRenderer renderer=new DefaultTableCellRenderer(){ //就是个类有问题,已经困扰我整个下午了
                        public Component getTableCellRendererComponent(JTable table,
                                    Object value, boolean isSelected, boolean hasFocus,
                                    int row, int column) {
                            int pointX=0,pointY=0;
                            
                            for(int i=0;i<tableChangedSets.size();i++){
                                pointX=tableChangedSets.get(i).x;
                                pointY=tableChangedSets.get(i).y;
                                
                                if(row==pointX&&column==pointY)
                                    setForeground(Color.lightGray);
                                else
                                    setForeground(Color.black);
                            }
                            return super.getTableCellRendererComponent(table, value,
                                      isSelected, hasFocus,row,column);
                        }
                   };
                   table.getColumnModel().getColumn(y).setCellRenderer(renderer);
                }
            }
        });
    }
}