2016-06-22 15 views
3

Also habe ich eine einfache Sinuswelle in Java gemacht. Ich wollte nur wissen, wie ich die Welle "animieren" könnte, um eine Wellenformbewegung zu zeigen."Animieren" Sinuszeichnung

Sine wave

Hier ist mein Code so weit:

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

import javax.swing.JPanel; 
import javax.swing.Timer; 

public class WavePane extends JPanel 
{ 
    int width = Waves.WIDTH, height = Waves.HEIGHT; 
    final int SPEED = 4; // 1000ms 

    Timer timer; 
    int phase; 

    public WavePane() { 
     phase = 0; 
     timer = new Timer(SPEED, new ActionListener() { 
      public void actionPerformed(ActionEvent event) { 
       phase++; 
       repaint(); 

       if(phase >= 360) { 
        phase = 0; 
       } 
      } 
     }); 
     timer.start(); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     g.drawLine(0, height/2, width, height/2); 

     drawWave(g, width, height, phase); 
    } 

    private void drawWave(Graphics g, int width, int height, int phase) { 
     for(double x = -(width/2); x <= (width/2); x = x + 0.5) { 
      double y = 50 * Math.sin((x + phase) * (Math.PI/180)); 

      int x1 = (int)x; 
      int y1 = (int)y; 

      g.setColor(Color.BLUE); 

      g.drawLine((width/2) + x1, (height/2) - y1 - 1, (width/2) + x1, (height/2) - y1 - 1); 
      g.drawLine((width/2) + x1, (height/2) - y1, (width/2) + x1, (height/2) - y1); 
      g.drawLine((width/2) + x1, (height/2) - y1 + 1, (width/2) + x1, (height/2) - y1 + 1); 
     } 
    } 
} 

Der Code funktioniert und Animation funktioniert auch! Aber wie kann ich es machen glatter?

+0

Normalerweise werden alle Animationen mit 'javax.swing.Timer' implementiert. Aber welche Animation brauchst du? –

+0

Ja, benutze einen Swing 'Timer', wie von @SergiyMedvynskyy vorgeschlagen, dann ändere' private void drawWave (Grafik g, int width, int height) {'zu etwas wie' private void drawWave (Grafik g, int width, int height, Doppelphase) {'& füge die' Phase' zu ​​'x' im' Math.sin (x * (Math.PI/180)); 'Ausdruck beim Zeichnen hinzu. –

+0

Okay, ich habe das OP mit meinem neuen Code aktualisiert. Die Animation funktioniert, aber wie kann ich es glatter machen (kein Stottern wenn es 360 erreicht?) – madcrazydrumma

Antwort

0

Die Methode repaint() musste bei jedem Update-Tick aufgerufen werden, um zu aktualisieren, was auf dem Bildschirm gerendert werden soll.