2017-08-17 27 views
0

因此,我正在JPanel中繪製線條,每次繪製一條線時,我都希望它暫停一秒。我使用了TimeUnit和Timer等其他的東西,我發現在這個網站上看到的東西,但到目前爲止,我只是無法讓它工作。我有JFrame所有的設置和準備去,這只是最後一塊。此外,我想知道是否有效的方法可以應用於其他類型的形狀和事物,而不僅僅是線條。如何在java中延遲繪畫進行中

public class Panel extends JPanel { 
    Color [] colors = {Color.WHITE, Color.BLUE, Color.RED,Color.YELLOW,Color.CYAN,Color.GREEN, Color.PINK,Color.ORANGE}; 
    Random r = new Random(); 
    int amount; 
    public Panel(int amount) { 
     this.amount = amount; 
    } 
    public void paintComponent(Graphics g) { 
     Graphics2D g2 = (Graphics2D)g; 
     for (int i = 0; i < amount; i++) { 
      Timer timer = new Timer(2000, new ActionListener() { 
       public void actionPerformed(ActionEvent evt) {  
        g2.setColor(colors[r.nextInt(7)]); 
        g2.drawLine(r.nextInt(600), r.nextInt(600), r.nextInt(600), r.nextInt(600)); 
       } 
      }); 
      timer.setRepeats(false); 
      timer.start(); 
     } 
    } 
} 
+1

繪畫方法不應該嘗試執行長時間運行的任務。基本上有兩種好方法可以解決這個問題,一個是存儲每次調用paint時需要着色的所有行的列表(這是幾千行中最快的,然後減慢),另一個是畫每一行到一個緩衝的圖像(這是每個油漆更多的工作,直到每個繪製每一行的努力,超過它)。你更願意追求哪種方法? –

+0

@RakeshKR請停止給Swing動畫的建議,直到你能解釋爲什麼***這個建議是錯誤的。 –

回答

2

這是給你的任務礦山解決方案

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Random; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.Timer; 
import javax.swing.WindowConstants; 

public class Panel extends JPanel { 
    Color[] colors = {Color.WHITE, Color.BLUE, Color.RED, Color.YELLOW, Color.CYAN, Color.GREEN, Color.PINK, Color.ORANGE}; 

    Random r = new Random(); 

    int amount, actual; 

    Color nextColor; 

    int x1, y1, x2, y2; 

    public Panel(int amount) { 
     this.amount = amount; 
     Timer timer = new Timer(2000, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent evt) { 
       nextColor = colors[r.nextInt(7)]; 
       x1 = r.nextInt(600); 
       x2 = r.nextInt(600); 
       y1 = r.nextInt(600); 
       y2 = r.nextInt(600); 
       repaint(); 
       if (++actual >= amount) { 
        Timer t = (Timer) evt.getSource(); 
        t.stop(); 
       } 
      } 
     }); 
     timer.setRepeats(true); 
     timer.start(); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     if (nextColor != null) { 
      g.setColor(nextColor); 
      g.drawLine(x1, y1, x2, y2); 
     } 

    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame frm = new JFrame("Lines"); 

       frm.add(new Panel(10)); 
       frm.setSize(700, 700); 
       frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
       frm.setLocationRelativeTo(null); 
       frm.setVisible(true); 
      } 
     }); 
    } 
} 
+0

謝謝老兄,這終於使它工作了!!!!!! –

-2

,你可以添加到您的代碼

public class Panel extends JPanel { 
Color [] colors = {Color.WHITE, Color.BLUE, Color.RED,Color.YELLOW,Color.CYAN,Color.GREEN, Color.PINK,Color.ORANGE}; 
Random r = new Random(); 
int amount; 
public Panel(int amount) { 
    this.amount = amount; 
} 
public void paintComponent(Graphics g) { 
    Graphics2D g2 = (Graphics2D)g; 
    for (int i = 0; i < amount; i++) { 
     Timer timer = new Timer(2000, new ActionListener() { 
       public void actionPerformed(ActionEvent evt) {  
        g2.setColor(colors[r.nextInt(7)]); 
        g2.drawLine(r.nextInt(600), r.nextInt(600), r.nextInt(600), r.nextInt(600)); 
TimeUnit.SECONDS.sleep(1); 
       } 
      }); 
     timer.setRepeats(false); 
     timer.start(); 
    } 
} 

您還可以在地方TIMEUNIT的使用Thread.sleep(1000)

+1

在Event Dispatcher Thread中使用sleep是一個糟糕的主意。 –

0

您的打印是沒有得到推遲,但由於您是針對循環寫入timer.start()多前最後2秒,因此調用next其被執行timer.start(),因此看起來好像定時器不工作。 我會建議你使用另一種邏輯。而且這種方法也可以應用於其他形狀。