我想用线程模拟一个画直线的动画,但是总是不同步,画出来的线是断断续续的..是哪出了问题?请问该怎么改..
public class MainThread{
public static void main(String[] args){
new DrawFrame();
}
}
class DrawFrame extends JFrame{
Thread thread;
public DrawFrame(){
setTitle("DrawFrame");
setSize(400,400);

DrawPanel p = new DrawPanel();
add(p);

thread = new Thread(p);
thread.start();

setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}

class DrawPanel extends JPanel implements Runnable{ public DrawPanel(){
rect.setFrame(X, Y, length, length);
}

public void run() {
// TODO Auto-generated method stub
while(flag){
try {
Thread.sleep(3);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

repaint();
X += 5;
rect.setFrame(X, Y, length, length); if (X > 300)
flag = false;
}
}

@Override
public void paint(Graphics g) {
// TODO Auto-generated method stub
//super.paint(g);
Graphics2D g2 = (Graphics2D)g;
g2.setColor(Color.BLACK);
g2.fill(rect);
} public void setFlag(boolean flag){
this.flag = flag; 
}

private boolean flag = true;
private double X = 10;
private double Y = 150;
private double length = 5;
private Rectangle2D rect = new Rectangle2D.Double();
}
}

解决方案 »

  1.   

    答:应该重写public void paintComponent(Graphics g)
    修改后代码如下:import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.Rectangle2D;import javax.swing.*;
    public class MainThread{
        public static void main(String[] args){
            new DrawFrame();
        }
    }
    class DrawFrame extends JFrame{
        Thread thread;    
        public DrawFrame(){
            setTitle("DrawFrame");
            setSize(400,400);
            
            DrawPanel p = new DrawPanel();
            add(p);
            
            thread = new Thread(p);
            thread.start();
            
            setVisible(true);
            this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        }
        
        class DrawPanel extends JPanel implements Runnable{        public DrawPanel(){
                rect.setFrame(X, Y, length, length);
            }
            
            public void run() {
                // TODO Auto-generated method stub
                while(flag){
                        try {
                            Thread.sleep(30);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        
                        repaint();
                        X += 5;
                        rect.setFrame(X, Y, length, length);                        if (X > 300)
                            flag = false;                
                }
            }
        
            @Override
            public void paintComponent(Graphics g) {
                // TODO Auto-generated method stub
                    super.paintComponent(g);
                    Graphics2D g2 = (Graphics2D)g;
                    g2.setColor(Color.BLACK);
                    g2.fill(rect);    
            }        public void setFlag(boolean flag){
                this.flag = flag; 
            }
            
            private boolean flag = true;
            private double X = 10;
            private double Y = 150;
            private double length = 5;
            private Rectangle2D rect = new Rectangle2D.Double();

        }
    }
      

  2.   

    改成那样以后还有时候是断线(不过不是很多),怎么回事?还有public void paint(Graphics g)和public void paintComponent(Graphics g) 有什么区别嘛?谢谢.