2013-04-07 2 views
0

빗방울이 화면을 아래로 내리고 바닥에 떨어질 때까지 계속 움직여야합니다. implements runnable을 사용하고 그것을 다시 그리는 run 메쏘드를 가지고 있습니다. 아무도 내가 누락 된 것을 알아?내 자바 애니메이션이 작동하지 않는 이유는 무엇입니까?

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

public class Screensaver extends JPanel implements Runnable{ 
    private final static int FRAME_HEIGHT = 600; 
    private final static int FRAME_WIDTH = 600; 
    int rainY = 100; 
    int rainGo = 1; 
    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setSize(FRAME_WIDTH,FRAME_HEIGHT); 
     frame.add(new Screensaver()); 
     frame.setVisible(true); 

    } 
    public Screensaver(){ 
     Color background; 
     background = new Color(212,202,115); 
     setBackground(background); 
    } 
    protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Color tree; 
      Color leaves; 
      Color cloud; 
      Color rain; 
      rain = new Color(0,128,255); 
      cloud = new Color(160,160,160); 
      leaves = new Color(0,204,0); 
      tree = new Color(102,0,0); 

      g.setColor(tree); 
      //g.drawLine(400, 375, 360, 340); 
      g.fillRect(400, 250,80, 320); 
      g.setColor(leaves); 
      g.fillOval(340,150 , 200, 160); 
      g.setColor(cloud); 
      g.fillOval(10,5,550,100); 

      Random random = new Random(); 
      int rainX1 = random.nextInt(500) + 40; 
      int rainW1 = random.nextInt(30) + 10; 
      int rainX2 = random.nextInt(500) + 40; 
      int rainW2 = random.nextInt(30) + 10; 
      int rainX3 = random.nextInt(500) + 40; 
      int rainW3 = random.nextInt(30) + 10; 
      int rainX4 = random.nextInt(500) + 40; 
      int rainW4 = random.nextInt(30) + 10; 

      g.setColor(rain); 
      g.fillOval(rainX1, rainY + rainGo, rainW1, rainW1); 
      g.fillOval(rainX2, rainY+ rainGo, rainW2, rainW2); 
      g.fillOval(rainX3, rainY+ rainGo, rainW3, rainW3); 
      g.fillOval(rainX4, rainY+ rainGo, rainW4, rainW4); 


     } 
    public void run(){ 
     while(true){ 
      changeRain(); 
      repaint(); 
     } 
    } 
    public void changeRain(){ 
     if(rainY+rainGo< FRAME_HEIGHT){ 
      rainGo++; 
     } 
     else{ 
      rainGo = 1; 
     } 
    } 
} 
+1

백그라운드 스레드를 만들고 시작 하시겠습니까? –

+0

실행 메소드는 어떻게 실행됩니까? – MadProgrammer

답변

3

짧은 대답 : Thread 애니메이션을 시작하지 않았습니다.

전체 답변 : 애니메이션을 위해 스윙 타이머와 같은 스윙 동시성 메커니즘 중 하나를 사용하십시오. 스윙 타이머는 스윙 구성 요소와 올바르게 상호 작용하도록 설계되었습니다.

1

배경 스레드를 만들고 시작하는 코드 어디에도 보이지 않습니다. 스레드는 단순히 스스로 시작하지 않습니다. 이 경로를 수행하는 경우 실행 방법에 Thread.sleep(...)을 넣으면 while 루프에 약간의 일시 중지가 발생합니다. 애니메이션을 위해 스윙 타이머를 사용하는 것이 더 좋습니다.

관련 문제