Swing i aktualizacja wyświetlania animacji

Odpowiedz Nowy wątek
2011-07-08 10:51
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

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

Pozostało 580 znaków

2011-07-08 11:54
Spect
0

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

Pozostało 580 znaków

2011-07-08 12:10
sunday16
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.

Pozostało 580 znaków

2011-07-08 15:05
Spect
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();
    }
 

Pozostało 580 znaków

2011-07-08 18:03
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

edytowany 1x, ostatnio: sunday16, 2011-07-08 19:18

Pozostało 580 znaków

2011-07-08 19:25
Spect
0

To może takie ustawienie pomoże

timer.setCoalesce(false);

Pozostało 580 znaków

2011-07-08 19:36
Spect
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?

Pozostało 580 znaków

2011-07-08 21:38

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:

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 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(); } } } ``` 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); } } } 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); } } ``` ```
edytowany 1x, ostatnio: sunday16, 2011-07-09 09:25

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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