Wyswietlanie animacji pilki w Javie

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

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

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