Java Animace – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Java Animace – Java – Fórum – Programujte.comJava Animace – Java – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
mjmajk0
Duch
23. 4. 2014   #1
-
0
-

Ahoj, snažím vykreslit postupně se zvětšovací kruh. Problém je v tom, že  tam zůstávají staré kruhy menší. Funkce repaint zde nefunguje. Nevíte někdo jak staré kruhy smazat ?

public void paint(Graphics g){
        for (int i = 0; i < 100; i++) {
            g.drawOval(100, 100, 20+i, 20+i);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                
                e.printStackTrace();
            }
        }
        
    }
Nahlásit jako SPAM
IP: 89.102.224.–
Reklama
Reklama
sleepy
~ Anonymní uživatel
422 příspěvků
27. 4. 2014   #2
-
0
-

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.

Nahlásit jako SPAM
IP: 158.195.196.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 23 hostů

Podobná vlákna

Animace — založil Malirka

Animace — založil Marketa

Animace — založil Michal

Animace — založil Michal

Animace — založil www

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý