2014-12-13 5 views
0
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(); 
}} 

이것은 처음으로이 사이트에서 질문하는 것이므로 실수로 사전에 사과드립니다.스레드로 GUI에서 도형에 애니메이션 적용하기

메신저 현재 스레드를 연구하고있는 버튼을 누르면 자동차가 움직이는 것으로되어 있지만, 이동하는 대신 버튼을 누르면 건너 뛰고 선택한 시간이 지나면 건너 뛰기가 나타납니다. 어떻게 해결할 수 있습니까 ??

답변

2
t.run(); 

위의 내용은 잘못되었습니다. 스레드를 사용하는 경우에는 사용할 필요가 :

t.start(); 

직접 run() 메소드를 호출 할 때, 방법은 이벤트 발송 쓰레드 GUI를 페인트 다시 스레드입니다 (EDT)에 실행합니다. 스레드가 절전 모드로 전환되면 루프가 실행을 마칠 때까지 GUI를 다시 칠할 수 없습니다. 자세한 내용은 Concurrency에있는 스윙 튜토리얼의 섹션을 참조하십시오.

또한 맞춤형 그림을 만드는 방식이 아닙니다. 사용자 정의 페인팅은 JPanel의 paintComponent(...) 메서드를 재정 의하여 수행합니다. 그런 다음 프레임에 패널을 추가합니다. 다시 Custom Painting의 자습서를 읽으십시오.

+0

고맙습니다. 나는 여전히 스레드에 대해 배울 필요가 ... – ProgrammerAtSea

관련 문제