各位大侠好:
    我在做一个Swing程序的时候,想完成这一一个功能:在 JPanel上动态显示多行文本,显示一行后,各2秒左右显示下一行。但是下面有问题,只能显示两行:import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TextPanel extends JPanel implements Runnable
{
  String seq="12345678901234567890123456789012345678901234567890ABCDEFGHI";
  public static int index=0;
  public TextPanel()
  {
    System.out.println("TextPanel is Constructed");
    this.setBackground(Color.BLACK);
    Dimension size=new Dimension(800,500);
    this.setPreferredSize(size);
  
  }
  public void paintComponents(Graphics g1)
  {
   super.paintComponents(g1);
  }
  public void paint(Graphics g)
  {
   super.paint(g);
   // Graphics2D g=(Graphics2D)g1;
   Font seqFont = new Font("Courier New", Font.BOLD, 16);
   g.setFont(seqFont);
   g.setColor(Color.WHITE);
   System.out.println(index+" In paint");
   g.drawString(seq,2,15*index+20);
  }

  public void run()
  {
   try{
    for(int i=0;i<5;i++) //在这里我想显示5行,但只有最后一次循环调用了repaint  ?
   {
      index++;
      Rectangle rec=new Rectangle(20,20*(index+1),700,20);
      repaint(rec);
    }
   
   }catch(Exception err){err.printStackTrace();}
  
  }
}import java.lang.Runnable;
public class T1 extends JFrame 
{
   TextPanel p=null;
   public  T1()
   {
  
        setTitle("Test");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Toolkit toolkit = getToolkit();
        Dimension size = toolkit.getScreenSize();
        this.setSize(size.width-50,size.height-100);
        setLocation(size.width/2 - getWidth()/2, 
size.height/2 - getHeight()/2);

p=new  TextPanel();
this.getContentPane().setLayout(new FlowLayout());
JButton btn=new JButton("OK");
btn.addActionListener(new ActionListener() 
{
            public void actionPerformed(ActionEvent event) 
            {
             Thread t=new Thread(p);
             t.start();
             //t.run();
            }
            }
        );
        this.add(p);
        this.add(btn);  }
  public static void main(String [] args)
  {
  
   T1 obj=new T1();
   obj.setVisible(true);
  }
}请各位帮忙,还可以另开贴给分!

解决方案 »

  1.   

    不要用Thread,用Timer,(可惜,在VC里用Timer就是OK的了,但是Java的Timer回调UI,还和从Thread回调一样)
      

  2.   

    用timer做的一个Demo,参考下import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Insets;
    import java.util.Timer;
    import java.util.TimerTask;import javax.swing.JFrame;public class Demo extends JFrame{ private static int DELAY = 300; Insets insets;
    String seq = "12345678901234567890123456789012345678901234567890ABCDEFGHI";
    public static int index = 0;

    Color colors[] = {Color.RED,Color.ORANGE,Color.YELLOW,Color.GREEN,Color.BLUE,Color.MAGENTA}; public void paint(Graphics g){
    super.paint(g);
    if(insets == null){
    insets = getInsets();
    }
    synchronized(colors){
    for(int i = 0;i < colors.length;i++){
    g.setColor(colors[i]);
    g.drawString(seq,3, 10 * index +20 );
    if(index > 50)
    index = 0;
    }
    }
    } public void go(){
    TimerTask task = new TimerTask() {
    public void run(){
    Color c = colors[0];
    synchronized(colors){
    System.arraycopy(colors,1,colors,0,colors.length - 1);
    colors[colors.length - 1] = c;
    index ++ ;
    }
    repaint();
    }
    };
    Timer timer = new Timer();
    timer.schedule(task,0,DELAY);
    } public static void main(String args[]){
    Demo f = new Demo();
    f.setBounds(300,100,600,500);
    f.setVisible(true);
    f.go();
    }
    }
      

  3.   

    如果是希望靠时间来控制程序运行的话 建议使用Timer
      

  4.   

    建议用timer,它与线程相似,耗费的资源也要少得多,看API文档,上面讲的也很简单、、、
      

  5.   

    恩  Timer  实现一段时间执行一个命令!!
    Thread成了同时执行了