2013-04-07 33 views
0

當我想讓雨滴沿着屏幕向下移動,直到它們碰到底部然後再次使用時,所有東西都還在。我使用了可運行的實現,並有一個重新繪製它的運行方法。任何人都知道我錯過了什麼?爲什麼我的java動畫不工作?

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

你在哪裏創建一個後臺線程並啓動它? – 2013-04-07 00:53:40

+0

你的run方法是如何執行的? – MadProgrammer 2013-04-07 00:55:05

回答

3

簡答:您沒有開始Thread開始動畫。

完整答案:使用Swing併發機制之一,例如Swing Timer用於動畫。 Swing定時器旨在與Swing組件正確交互。

1

我在代碼中看不到任何地方創建了一個背景線程並啓動它。線程不會簡單地自行啓動。如果你確實走這條路線,考慮在你的跑步方法中放一個Thread.sleep(...)讓while循環略微暫停。雖然爲您的動畫使用擺動計時器更好。