Swing i aktualizacja wyświetlania animacji

0

Witam

Mam program który graficznie ukazuje powstawanie funkcji sinus. Problem jest z ustawieniem metody sleep(), aby kolejne wyświetlenie obrazu było opóźnione o pewien czas. Drugim problemem jest taki ,gdy zmieniam kąt "k" zmienia się tylko położenie funkcji sinus a nie wektora

<code = java>
import java.awt.;
import java.awt.Graphics.
;
import java.awt.event.ActionEvent;
import javax.swing.*;

class DrawTestFrame extends JFrame
{
public static final int D_WIDTH = 450;
public static final int D_HEIGHT = 380;

public DrawTestFrame()
{
    setTitle("DrawTest");
    setSize(D_WIDTH, D_HEIGHT);
    
    //dodanie panelu do ramki
    DrawComponent2 component = new DrawComponent2();
    add(component);      
    
}

}
class DrawComponent2 extends JComponent {
int vxmin;
int vxmax;
int vymin;
int vymax;
double xmin;
double xmax;
double ymin;
double ymax;
double PI;
double bun;

Graphics g;
ActionEvent event;

public int map(int sw, double z)
{
    int s = 2;
    if((double)sw < 0.5D)
        s = vxmin + (int)(((z - xmin) / (xmax - xmin)) * (double)(vxmax - vxmin));
    if((double)sw > 0.5D)
        s = vymin + (int)(((ymax - z) / (ymax - ymin)) * (double)(vymax - vymin));
    return s;
}
 public void drawGraph(Graphics g, int k)
 {
    vxmax = 400;
    vymax = 160;
    xmin = -3D;
    xmax = 7D;
    ymin = -2D;
    ymax = 2D;
    PI = 3.1415920000000002D;
    bun = 72D;       
    
    Graphics2D g2 = (Graphics2D) g;
    int r = map(0, 1.0D) - map(0, 0.0D);
    //ustawia kolor tła
    g2.setColor(new Color(235, 225, 200));
    //wypełnia prostokąt
    g2.fillRect(vxmin, vymin, vxmax - vxmin, vymax - vymin);
    //kolor lini prostokąta
    g2.setColor(Color.black);
    //Rysuje prostokąt
    g2.drawRect(vxmin, vymin, vxmax - vxmin - 1, vymax - vymin - 1);
    //Linia osi x        
    g2.drawLine(map(0, xmin), map(1, 0.0D), map(0, xmax), map(1, 0.0D));
    //linia osi y
    g2.drawLine(map(0, 0.0D), map(1, ymax), map(0, 0.0D), map(1, ymin));
    //wyświetlenie i ustawienie liczb na układzie współrzędnych
    g2.drawString("O", map(0, 0.0D) + 2, map(1, 0.0D) + 12);
    g2.drawString("180", map(0, PI), map(1, 0.0D) + 12);
    g2.drawString("360", map(0, 2D * PI), map(1, 0.0D) + 12);
    g2.drawString("1", map(0, -0.40000000000000002D), map(1, 0.0D) + 12);
    g2.drawString("1", map(0, -1.3999999999999999D), map(1, 1.1000000000000001D));
    //Rysuje okrąg
    g2.drawOval(map(0, -1.5D) - r, map(1, 0.0D) - r, 2 * r, 2 * r);
    //Linia przechodząca przez okrąg 
    g2.drawLine(map(0, -1.5D), map(1, ymax), map(0, -1.5D), map(1, ymin));
    //Powstawanie funkcji sinus
    double co = Math.cos(((double)k / bun) * PI * 2D);
    double si = Math.sin(((double)k / bun) * PI * 2D);
    g2.drawLine(map(0, -1.5D + co), map(1, si), map(0, ((double)k / bun) * PI * 2D), map(1, si));
    g2.drawLine(map(0, -1.5D), map(1, 0.0D), map(0, -1.5D + co), map(1, si));
    g2.setColor(Color.red);
    g2.drawLine(map(0, -1.5D + co), map(1, 0.0D), map(0, -1.5D + co), map(1, si));
    g2.setColor(Color.blue);
    for(int xi = 0; xi <= k; xi++)
    {
        double x1;
        if((double)xi < 0.10000000000000001D)
              x1 = 0.0D;
                else
                    x1 = ((double)(xi - 1) / bun) * PI * 2D;
                double y1 = Math.sin(x1);
                double x2 = ((double)xi / bun) * PI * 2D;
                double y2 = Math.sin(x2);
                g.drawLine(map(0, x1), map(1, y1), map(0, x2), map(1, y2));
            }

        g2.setColor(Color.red);
        g2.drawLine(map(0, ((double)k / bun) * PI * 2D), map(1, 0.0D), map(0, ((double)k / bun) * PI * 2D), map(1, si));
   }
    
@Override
public void paintComponent(Graphics g)
{
    for(int k = 0; k<=bun; k++)
    {
        try{
            drawGraph(g, k);
            Thread.sleep(40L);
        }catch (InterruptedException e) {}
    }
}    

}
public class DrawTest2 {
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
@Override
public void run()
{
DrawTestFrame frame = new DrawTestFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}

0

Możesz mi wytłumaczyć co robi metoda drawGraph(g, k);

0

Metoda drawGraph(g,k) ustawia wszystkie elementy oraz ma za zadanie przedstawiać powstawanie funkcji sinus w ten sposób że dla kolejnych wartości k, poszczególne elementy maja zmieniane współrzędne.

1

Czyli rysuje k-tą klatkę animacji.

    public void paintComponent(Graphics g) {
        drawGraph(g, k);
    } 

a javax.swing.Timer inicjuje odrysowanie komponentu z k+1 klatką

  public DrawComponent2() {
        timer = new Timer(CZAS_TRWANIA_KLATKAMI, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                k++;
                if (k >= bun) {
                    timer.stop();
                }
                repaint();//inicjacja odrysowania

            }
        });
        timer.start();
    }
 
0

Dzięki Spect. Pomogło , ale nie wiem czemu przy paru próbach zaczyna mi wariować animacja tzn. wygląda to tak jak by przy kolejnych krokach wykonywało na raz k klatek. Ponad to wyrzuca error że timer.stop() nie jest inicjalizowany

0

To może takie ustawienie pomoże

timer.setCoalesce(false);

0
Spect napisał(a)

To może takie ustawienie pomoże

timer.setCoalesce(false);

To nie jest dobra rada (jako gość nie mogę edytować)

Czy dodawałeś coś jeszcze do programu?

0

Już działa. Wielkie dzięki za naprowadzenie na właściwy trop :). Nawet nie wiedziałem że jest jakiś Timer w swingu :)
Pozmieniałem właściwie cały projekt i teraz wygląda to tak:

<code = java>

import java.awt.*;
/**
*

  • @Author Sunday
    */
    public class DrawGraph {
    private int vxmin;
    private int vxmax;
    private int vymin;
    private int vymax;
    private double xmin;
    private double xmax;
    private double ymin;
    private double ymax;
    private double PI;
    private double bun;
    private int k;

    public DrawGraph()
    {
    this.vxmax = -1;
    this.vxmin = -1;
    this.vxmax = -1;
    this.vymax = -1;
    this.xmin = -1;
    this.xmax = -1;
    this.ymin = -1;
    this.ymax = -1;
    this.PI = -1.0;
    this.bun = -1;
    this.k = 0;
    }
    public void setK(int k)
    {
    this.k = k;
    }
    public int map(int sw, double z)
    {
    int s = 2;
    if((double)sw < 0.5D)
    s = vxmin + (int)(((z - xmin) / (xmax - xmin)) * (double)(vxmax - vxmin));
    if((double)sw > 0.5D)
    s = vymin + (int)(((ymax - z) / (ymax - ymin)) * (double)(vymax - vymin));
    return s;
    }
    public void draw(Graphics g)
    {
    vxmax = 400;
    vymax = 160;
    xmin = -3D;
    xmax = 7D;
    ymin = -2D;
    ymax = 2D;
    PI = 3.1415920000000002D;
    bun = 72D;

     Graphics2D g2 = (Graphics2D) g;
     int r = map(0, 1.0D) - map(0, 0.0D);
     //ustawia kolor tła
     g2.setColor(new Color(235, 225, 200));
     //wypełnia prostokąt
     g2.fillRect(vxmin, vymin, vxmax - vxmin, vymax - vymin);
     //kolor lini prostokąta
     g2.setColor(Color.black);
     //Rysuje prostokąt
     g2.drawRect(vxmin, vymin, vxmax - vxmin - 1, vymax - vymin - 1);
     //Linia osi x        
     g2.drawLine(map(0, xmin), map(1, 0.0D), map(0, xmax), map(1, 0.0D));
     //linia osi y
     g2.drawLine(map(0, 0.0D), map(1, ymax), map(0, 0.0D), map(1, ymin));
     //wyświetlenie i ustawienie liczb na układzie współrzędnych
     g2.drawString("O", map(0, 0.0D) + 2, map(1, 0.0D) + 12);
     g2.drawString("180", map(0, PI), map(1, 0.0D) + 12);
     g2.drawString("360", map(0, 2D * PI), map(1, 0.0D) + 12);
     g2.drawString("1", map(0, -0.40000000000000002D), map(1, 0.0D) + 12);
     g2.drawString("1", map(0, -1.3999999999999999D), map(1, 1.1000000000000001D));
     //Rysuje okrąg
     g2.drawOval(map(0, -1.5D) - r, map(1, 0.0D) - r, 2 * r, 2 * r);
     //Linia przechodząca przez okrąg 
     g2.drawLine(map(0, -1.5D), map(1, ymax), map(0, -1.5D), map(1, ymin));
     //Powstawanie funkcji sinus
    
     double co = Math.cos(((double)k / bun) * PI * 2D);
     double si = Math.sin(((double)k / bun) * PI * 2D);
     g2.drawLine(map(0, -1.5D + co), map(1, si), map(0, ((double)k / bun) * PI * 2D), map(1, si));
     g2.drawLine(map(0, -1.5D), map(1, 0.0D), map(0, -1.5D + co), map(1, si));
     g2.setColor(Color.red);
     g2.drawLine(map(0, -1.5D + co), map(1, 0.0D), map(0, -1.5D + co), map(1, si));
     g2.setColor(Color.blue);
     for(int xi = 0; xi <= k; xi++)
     {
         double x1;
         if((double)xi < 0.10000000000000001D)
               x1 = 0.0D;
                 else
                     x1 = ((double)(xi - 1) / bun) * PI * 2D;
                 double y1 = Math.sin(x1);
                 double x2 = ((double)xi / bun) * PI * 2D;
                 double y2 = Math.sin(x2);
                 g.drawLine(map(0, x1), map(1, y1), map(0, x2), map(1, y2));
             }
    
         g2.setColor(Color.red);
         g2.drawLine(map(0, ((double)k / bun) * PI * 2D), map(1, 0.0D), map(0, ((double)k / bun) * PI * 2D), map(1, si));
    

    }
    }

Klasa DrawGraphBox
<code = java>


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
/**
 *
 * @author Sunday
 */
public class DrawGraphBox extends JPanel{
    private DrawGraph graph = new DrawGraph();
    
    
    private int   m_interval  = 35;  
    private Timer m_timer;           
    private int k;
    
    public DrawGraphBox()
    {
        setPreferredSize(new Dimension(400, 200));
        setBorder(BorderFactory.createLineBorder(Color.BLACK));
        m_timer = new Timer(m_interval, new TimerAction());  
        
    }
    
    public void setAnimation(boolean turnOnOff) {
        if (turnOnOff) {
            m_timer.start();  
        } else {
            m_timer.stop();   
        }
    }
        public void paintComponent(Graphics g) {
        super.paintComponent(g);  
        graph.draw(g);           
    }
        
        class TimerAction implements ActionListener {
        
        @Override
        public void actionPerformed(ActionEvent e) {
            graph.setK(k);
            k++;
            repaint();      
        }
    }
}

<code = java>
import java.awt.;
import java.awt.event.
;
import javax.swing.*;
/**
*

  • @Author Sunday
    */
    public class DrawGraphPanel extends JPanel {
    DrawGraphBox b_graph ;

    public DrawGraphPanel()
    {
    b_graph = new DrawGraphBox();
    JButton startButton = new JButton("Start");
    JButton stopButton = new JButton("Stop");

     startButton.addActionListener(new StartAction());
     stopButton.addActionListener(new StopAction());
    
    
     JPanel buttonPanel = new JPanel();
     buttonPanel.setLayout(new FlowLayout());
     buttonPanel.add(startButton);
     buttonPanel.add(stopButton);
    
    
     this.setLayout(new BorderLayout());
     this.add(buttonPanel, BorderLayout.NORTH);
     this.add(b_graph       , BorderLayout.CENTER);
    

    }

    class StartAction implements ActionListener {
    public void actionPerformed(ActionEvent e) {
    b_graph.setAnimation(true);
    }
    }

    class StopAction implements ActionListener {
    public void actionPerformed(ActionEvent e) {
    b_graph.setAnimation(false);
    }
    }
    }

<code = java>
import javax.swing.*;
/**
*

  • @Author Sunday
    */
    public class DrawGraphDemo extends JFrame{
    public DrawGraphDemo() {
    add(new DrawGraphPanel());
    }

    //============================================================ main
    public static void main(String[] args) {
    JFrame win = new JFrame("Powstawanie funkcji sinus");
    win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

     win.setContentPane(new DrawGraphPanel());
    
     win.pack();
     win.setVisible(true); 
    

    }
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1