2017-08-17 1 views
0

So zeichne ich Linien in einem JPanel und ich möchte es für eine Sekunde pausieren, jedes Mal, wenn es ein zeichnet. Ich habe andere Dinge wie TimeUnit und Timer benutzt, die ich auf dieser Website gefunden habe, aber bis jetzt kann ich es einfach nicht zum Laufen bringen. Ich habe den JFrame eingerichtet und bereit zu gehen und das ist nur das letzte Stück. Ich habe mich auch gefragt, ob die Methode, die funktioniert, auf andere Arten von Formen und Dingen angewendet werden kann, statt nur auf Linien.Wie verzögert man ein Gemälde in Bearbeitung in 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

Die Malmethoden sollten niemals versuchen, eine lange laufende Aufgabe zu implementieren. Es gibt im Grunde genommen zwei gute Möglichkeiten, eine Liste aller Linien zu erstellen, die jedesmal gemalt werden müssen, wenn Farbe aufgerufen wird (das ist am schnellsten für ein paar tausend Zeilen, aber dann langsamer), und das andere ist es, jede Linie zu einem gepufferten Bild zu zeichnen (das ist mehr Arbeit für jede Farbe, bis der Aufwand, jede Linie einzeln zu zeichnen, übertrifft). Welchen Ansatz würden Sie bevorzugen? –

+0

@RakeshKR Bitte hören Sie auf, Swing-Animationen zu geben, bis Sie erklären können, warum dieser Rat falsch ist. –

Antwort

2

ist meine Lösung für Ihre Aufgabe

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

Danke dude das hat es endlich geschafft !!!!!! –

-2

Sie können diese zu Ihrem Code hinzufügen

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(); 
    } 
} 

Sie auch Thread.sleep(1000) anstelle von Timeunit verwenden können. Hier

+1

Es ist eine schlechte Idee, den Schlaf im Event Dispatcher Thread zu verwenden. –

0

Ihr Druck nicht verzögert zu werden, aber da Sie schreiben timer.start() in for-Schleife, die viel vor 2 Sekunden ausgeführt wird und somit den Aufruf die nächsten timer.start() und deshalb scheint es, als ob der Timer nicht funktioniert. Ich würde Ihnen empfehlen, eine andere Logik zu verwenden. Und ja, diese Methode kann auch auf andere Formen angewendet werden.

Verwandte Themen