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