Toto nie je ten najlepsi sposob riesenia danho problemu. Ak chces robit animaciu, tak overridnes paint alebo paintComponent. Vhodne je si vytvorit Drawable object, ktory si drzi vstky potrebne veci a vie sa vykreslit, ked o to poziadas, prip. updatnut. Ja by som siel asi nejako takto, ale vobec sa toho nemusis drzat. Pozor ten kod nieje kompletny treba ho dopisat, aby fungoval.
interface Drawable extends Observer{
public void draw(Graphics g);
}
class Canvas extends JPanel implements Observer{
private final List<Drawable> drawableObjects = new ArrayList<>();
public List<Drawable> getDrawable() {
return this.drawableObjects;
}
// metody
@Override
public void paintComponent(Graphics g){
super.paintComponent(g); // prekresli na krasnu sedu
// tymto docielis aby ti ostatne kruhy zmizly
for (drawableObject : drawableObjects) {
drawableObject.draw(g);
}
}
@Override
public void update(/*Tu neviem ake su argumenty ale java doc a slusne IDE ti prezradia*/){
repaint(); // toto by mohlo stacit na update
// vola funkciu update(Graphics g) a ta pain a
// paintComponent
}
}
class Animation{
// Toto je v nejakej class-e napr. nazvyme je Animation
// a observable moze byt jeho field. A budes mat aj lepsi pristup k nemu
private final Observable observable = new Observale();
public Observable getObservable() {
return this.observable;
}
public void runAnimation() {
int delay = 1000; //milliseconds
// toto nemusi byt len lokalna premenna moze to byt v classe co sa stara o
// animaciu
// das tam vsetky observery a spustis
ActionListener taskPerformer = new ActionListener() {
Observable obs = observable
public void actionPerformed(ActionEvent evt) {
obs.notifyObservers()
}
};
new Timer(delay, taskPerformer).start();
}
}
class DrawableCircle implements Drawable{
int x,y; //cez kostruktor nastavis
int w,h;
@Override
public void draw(Graphics g){
g.drawOval(x,y,w,h);
}
@Override
public void update(/*znova tie iste fieldy*/) {
this.w++;
this.h++;
}
}
Tu je Timer: http://docs.oracle.com/javase/7/docs/api/javax/swing/Timer.html a tu je nieco napisane o Observable a Observery: http://www.javaworld.com/article/2077258/learn-java/observer-and-observable.html.
Inak v tvojom rieseni staci dopisat do toho for cyklu super.paintComponent(g); na zaciatok a pojde to. Ale odporucam ti pouvazovat aj nad tym postupom co som napisal, kvoli lepsej modularite. A mozno ti to bude tearovat, take veci sa odstranuju double buffeingom. V podstate renderujes do obrazku (backbufferu) a potom ho vykreslis naraz na obrazovku.