Wyswietlanie animacji pilki w Javie

Odpowiedz Nowy wątek
2013-01-01 01:09

Rejestracja: 7 lat temu

Ostatnio: 5 lat temu

0
package pl.java.myproject;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;

import javax.swing.JPanel;

class MyPanel extends JPanel {
    private Ball ball;

    public MyPanel () {
        ball = new Ball();

        try {
            for (int i=0; i<100; i++) {
                ball.moveBall();
                paint(getGraphics());
                Thread.sleep(10);
            }
        } catch (InterruptedException e) {

        }
    }

    public void paintComponent (Graphics g) {
        Graphics2D g2 = (Graphics2D)g;
        g2.fill(new Ellipse2D.Double(ball.getX(), ball.getY(), 20, 20));
    }

}

Po odpaleniu aplikacji jest pusto i po kilku sekundach pojawia sie pilka. Dlaczego nie jest na biezaco aktualizowana jej pozycja? Pewnie cos z paint(getGraphics()) jest nie tak tylko nie wiem co. Prosze o pomoc

Pozostało 580 znaków

Anony
2013-01-01 01:50
Anony
0

Obraz pojawia się po kilku sekundach, bo po pierwsze takich operacji (jak przerysowywanie) nie można robić w konstruktorze klasy - zrób do tego metodę w tej klasie. Obraz pojawia się dla Ciebie dopiero po pewnym czasie, bo najpierw jest wykonywana pętla w konstruktorze włączając w to usypianie wątku, które łącznie zajmuje 10ms*100=1000ms=1s + czas potrzebny na narysowanie oraz wykonanie pozostałych instrukcji w pętli. Generalnie źle dobrałeś czasy ;]

Trzeba ponadto czyścić JPanel po narysowaniu aby zauważyć animację, bo dostaniesz ciąg kółek, dopisz to:

super.paintComponent(g);

w metodzie paintComponent.

Działający kod:

package pl.java.myproject;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;

import javax.swing.JPanel;

class MyPanel extends JPanel {
        private Ball ball;

        public MyPanel () {         
                ball = new Ball();
                setPreferredSize(new Dimension(400, 400));
        }

        public void dzialaj() {
            try {
                    for (int i=0; i<180; i++) {
                            ball.moveBall();
                            paint(getGraphics());
                            Thread.sleep(100);
                    }
            } catch (InterruptedException e) {

            }
            System.out.println("p");
        }

        public void paintComponent (Graphics g) {
                super.paintComponent(g);
                Graphics2D g2 = (Graphics2D)g;
                g2.fill(new Ellipse2D.Double(ball.getX(), ball.getY(), 20, 20));
        }

}
package pl.java.myproject;

public class Ball {
    private int x;
    private int y;

    public Ball() {
        this.x = 0;
        this.y = 0;
    }

    public void moveBall() {
        this.x += 2;
        this.y += 2;
    }

    public int getX() {
        return this.x;

    }

    public int getY() {
        return this.y;

    }

}
package pl.java.myproject;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class MyFrame extends JFrame {
    private MyPanel panel;

    public MyPanel getPanel() {
        return panel;
    }

    public MyFrame() {
        super("BALL");
        panel = new MyPanel();
        add(panel); 
        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
    public static void main(String[] args) {
        new MyFrame().getPanel().dzialaj();
    }
}

Pozostało 580 znaków

Odpowiedz

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