我最近要做一个任务:
每秒刷新每行内容而且每行要根剧标志(flag)而变化颜色,每一个行都有不定的flag。
flag=1红flag=2黄flag=3浅蓝.谁做对,喊他牛人,it精英,SWING王子。高分求解。3天之内没有人回答出,以后再回答出,也不给分。
   我的代码:
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;import java.util.*;
import java.awt.*;
public class SwingTableTest3  extends JApplet implements Runnable
{
AbstractTableModel tm;
    //声明一个类AbstractTableModel对象
JTable jg_table;//声明一个类JTable对象
Vector vect;//声明一个向量对象
JScrollPane jsp;//声明一个滚动杠对象
String title[]={"JTABLE","无情",
"夕阳","岁月","人生"};
static int i=0; public void init()
{
vect=new Vector();//实例化向量
tm=new AbstractTableModel()
{
public int getColumnCount(){
return title.length;}//取得表格列数
public int getRowCount(){
return vect.size();}//取得表格行数
public Object getValueAt(int row,int column)
{
if(!vect.isEmpty())
return  
((Vector)vect.elementAt(row)).elementAt(column);
else
return null;}//取得单元格中的属性值
public String getColumnName(int column)
{
return title[column];
}//设置表格列名
public void setValueAt(Object value,int row,int column)
{

}
       //数据模型不可编辑,该方法设置为空
public Class getColumnClass(int c)
{
return getValueAt(0,c).getClass();
}//取得列所属对象类
public boolean isCellEditable(int row,int column){
return false;}//设置单元格不可编辑,为缺省实现
};
jg_table=new JTable(tm);//生成自己的数据模型
jg_table.setToolTipText("显示全部查询结果");
       //设置帮助提示
jg_table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    //设置表格调整尺寸模式
jg_table.setCellSelectionEnabled(false);
       //设置单元格选择方式
jg_table.setShowVerticalLines(true);
//设置是否显示单元格间的分割线
jg_table.setShowHorizontalLines(true);
jsp=new JScrollPane(jg_table);//给表格加上滚动杠
this.getContentPane().add(jsp);
resize(800,600);
Thread t=new Thread(this);
t.start();
}
public void run()
{
while(true)
{
try
{
  vect.removeAllElements();
  tm.fireTableStructureChanged();
  Vector vtemp=new Vector();
  //颜色标志 1:表示红 2:表示黄 3:表示浅绿
  int []flag=new int[100];
  for(int z=0;z<=99;z++)
  {
  flag[z]=(int)(Math.random()*3)+1;
  }
  for(int m=0;m<100;m++)
  { 
  jg_table.setDefaultRenderer(Object.class,new EvenOddRendererY(m,flag[m]));
  vtemp.addElement("AAAA"+new Integer(i).toString());
  vtemp.addElement("BBBB"+new Integer(i).toString());
  vtemp.addElement("CCCC"+new Integer(i).toString());
  vtemp.addElement("DDDD"+new Integer(i).toString());
  vtemp.addElement("EEEE"+new Integer(i).toString());
  vect.addElement(vtemp);
  }
  tm.fireTableStructureChanged();
  System.out.println("GOOD");
  Thread.sleep(2000);
  i++;
}catch(Exception e){}
}

}

}
class EvenOddRendererY implements TableCellRenderer
{
  Color  background;
  int x;
  int flag;
  public EvenOddRendererY(int x,int flag)
  {
 this.x=x;
 this.flag=flag;
  }
  public static final DefaultTableCellRenderer DEFAULT_RENDERER = new DefaultTableCellRenderer();  public synchronized Component getTableCellRendererComponent(JTable table, Object value,
      boolean isSelected, boolean hasFocus, int row, int column) 
  {
    Component renderer = DEFAULT_RENDERER.getTableCellRendererComponent(
        table, value, isSelected, hasFocus, row, column);
    ((JLabel) renderer).setOpaque(true);
    if(row==x)
     background=setColor(flag);
    renderer.setBackground(background);
    return renderer;
  }
  public Color setColor(int flag)
  {
  switch(flag)
  {
  case 1:return Color.red;
  case 2:return Color.yellow;
  case 3:return Color.cyan;
  default:return Color.gray;
  }
  }
}

解决方案 »

  1.   

    今天难得有点时间来调一调程序,这个程序其实是你自己思路有问题,在render里输出一下flag就知道了import javax.swing.*;
    import javax.swing.table.*;import java.util.*;
    import java.awt.*;public class SwingTableTest3 extends JFrame implements Runnable
    {
        AbstractTableModel tm;    //声明一个类AbstractTableModel对象
        JTable jg_table;//声明一个类JTable对象    Vector vect;//声明一个向量对象    JScrollPane jsp;//声明一个滚动杠对象    String title[] =
        {
                "JTABLE", "无情", "夕阳", "岁月", "人生"
        };    static int i = 0;    public void init()
        {
            vect = new Vector();//实例化向量
            tm = new AbstractTableModel()
            {
                public int getColumnCount()
                {
                    return title.length;
                }//取得表格列数            public int getRowCount()
                {
                    return vect.size();
                }//取得表格行数            public Object getValueAt(int row, int column)
                {
                    if (!vect.isEmpty())
                        return ((Vector) vect.elementAt(row)).elementAt(column);
                    else
                        return null;
                }//取得单元格中的属性值            public String getColumnName(int column)
                {
                    return title[column];
                }//设置表格列名            public void setValueAt(Object value, int row, int column)
                {            }            //数据模型不可编辑,该方法设置为空
                public Class getColumnClass(int c)
                {
                    return getValueAt(0, c).getClass();
                }//取得列所属对象类            public boolean isCellEditable(int row, int column)
                {
                    return false;
                }//设置单元格不可编辑,为缺省实现
            };
            
            jg_table = new JTable(tm);//生成自己的数据模型
            jg_table.setToolTipText("显示全部查询结果");
            //设置帮助提示
            jg_table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            //设置表格调整尺寸模式
            jg_table.setCellSelectionEnabled(false);
            //设置单元格选择方式
            jg_table.setShowVerticalLines(true);
            //设置是否显示单元格间的分割线
            jg_table.setShowHorizontalLines(true);
            jsp = new JScrollPane(jg_table);//给表格加上滚动杠
            this.getContentPane().setLayout(new BorderLayout());
            this.getContentPane().add(jsp, BorderLayout.CENTER);
            resize(800, 600);
            Thread t = new Thread(this);
            t.start();
        }    int count = 0;
        public void run()
        {
            while(true)
            {
                count ++;
                try
                {
                    vect.removeAllElements();
    //                tm.fireTableStructureChanged();
                    Vector vtemp = new Vector();
                    //颜色标志 1:表示红 2:表示黄 3:表示浅绿
                    int[] flag = new int[10];
                    for (int z = 0; z <= 9; z++)
                    {
                        flag[z] = (int) (Math.random() * 3) + 1;
    //                    System.out.println("flag:" + flag[z]);
                    }
                    jg_table.setDefaultRenderer(Object.class, new EvenOddRendererY(flag));
                    for (int m = 0; m < 10; m++)
                    {
                        vtemp.addElement("AAAA" + new Integer(i).toString());
                        vtemp.addElement("BBBB" + new Integer(i).toString());
                        vtemp.addElement("CCCC" + new Integer(i).toString());
                        vtemp.addElement("DDDD" + new Integer(i).toString());
                        vtemp.addElement("EEEE" + new Integer(i).toString());
                        vect.addElement(vtemp);
                    }
                    tm.fireTableDataChanged();
    //                tm.fireTableStructureChanged();
                    System.out.println("GOOD");
                    Thread.sleep(2000);
                    i++;
                }
                catch(Exception e)
                {
                }
            }    }
        public static void main(String[] args)
        {
            SwingTableTest3 frame = new SwingTableTest3();
            frame.init();
            frame.setVisible(true);
        }
    }class EvenOddRendererY implements TableCellRenderer
    {
        Color background;    int[] flag;    public EvenOddRendererY(int[] flag)
        {
            this.flag = flag;
        }    public static final DefaultTableCellRenderer DEFAULT_RENDERER = new DefaultTableCellRenderer();    public synchronized Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int row, int column)
        {
            Component renderer = DEFAULT_RENDERER.getTableCellRendererComponent(table, value, isSelected,
                    hasFocus, row, column);
            ((JLabel) renderer).setOpaque(true);
    //        if (row == x)
                background = getColor(flag[row]);
                System.out.println("flag:" + flag);
            renderer.setBackground(background);
            return renderer;
        }    public Color getColor(int flag)
        {
            switch(flag)
            {
                case 1:
                    return Color.red;
                case 2:
                    return Color.yellow;
                case 3:
                    return Color.cyan;
                default:
                    return Color.gray;
            }
        }
        }
      

  2.   

    你要特别注意一下,为什么setDefaultRenderer在放在循环外面,
    请我吃饭就不必了,是我自己无聊喔