使用线程在GUI中动画形状

时间:2014-12-13 16:57:07

标签: java eclipse multithreading swing user-interface

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Exercise2 extends JFrame implements ActionListener, Runnable{
public int x = 20;

public Exercise2(){
     setSize(400, 200);
     setTitle("Moving Car");
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     setLayout(new BorderLayout());
     JButton move = new JButton("Move the car");
     move.addActionListener(this);
     add(move , BorderLayout.SOUTH);
     setVisible(true);
}
public void paint(Graphics g){
    super.paint(g);
    g.drawRect(x, 80, 80, 50);
    g.drawOval(x, 130, 30, 30);
    g.drawOval(x+50, 130, 30, 30);
}
public void actionPerformed(ActionEvent e){
  Thread t = new Thread(this);
  t.run();
}
public void run(){
  for(int i = 0; i < 400; i += 10){
      x += 10;
      repaint();
      try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
  }
}
public static void main(String []args){
 new Exercise2();
}}

这是我第一次在这个网站上提问,所以我提前为我的错误道歉。

我正在研究线程,我应该按下按钮使汽车移动,但当我按下按钮而不是移动它只是跳过并在我选择的时间后出现在另一侧。 我该怎么办?

1 个答案:

答案 0 :(得分:2)

t.run();

以上是不正确的。使用线程时,您需要使用:

t.start();

当您直接调用run()方法时,该方法在Event Dispatch Thread(EDT)上执行,该线程是重新绘制GUI的线程。当你告诉线程休眠时,它不能重新绘制GUI,直到循环完成执行。有关详细信息,请参阅Concurrency上Swing教程中的部分。

另外,这不是自定义绘画的方式。自定义绘制是通过覆盖JPanel的paintComponent(...)方法完成的。然后将面板添加到框架中。再次阅读Custom Painting上的教程。