我想用线程模拟一个画直线的动画,但是总是不同步,画出来的线是断断续续的..是哪出了问题?请问该怎么改..
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();
}
}
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();
}
}
修改后代码如下: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();
}
}