Uh ... Pogresio si. Ali, to vec znas i sam, zar ne ?
Evo ti za pocetak kod koji radi:
Code:
import java.awt.*;
import java.util.Timer;
import java.util.TimerTask;
public class Test extends Frame {
public Test() {
super("Test");
setSize(400,300);
setVisible(true);
Timer timer = new Timer();
timer.schedule(new My(),0,1000);
}
private int counter = 0;
public void paint(Graphics g) {
if (++counter%2 == 0) {
g.setColor(Color.red);
} else {
g.setColor(Color.blue);
}
g.drawLine(0,0,100,100);
}
class My extends TimerTask {
public void run() {
repaint();
}
}
public static void main(String args[]) {
new Test();
}
}
I jos jedanput, drugi oblik koda koji radi (ovo je vec slicnije tvojoj ideji)
Code:
import java.awt.*;
import java.util.Timer;
import java.util.TimerTask;
public class Test extends Frame {
public Test() {
super("Test");
setSize(400,300);
setVisible(true);
}
public void paint(Graphics g) {
class My extends TimerTask {
Graphics gr = getGraphics();
private int counter = 0;
public void run() {
if (++counter%2 == 0) {
gr.setColor(Color.red);
} else {
gr.setColor(Color.blue);
}
gr.drawLine(0,0,100,100);
}
}
Timer timer = new Timer();
timer.schedule(new My(),0,1000);
}
public static void main(String args[]) {
new Test();
}
}
Napomena: ono sa int counter i sa setovanjem boja ima svrhu tek da pokaze da program "radi".
Evo sta si pogresio:
Deklaracijom "final" postize se da promenljiva zapravo postane konstanta. Dakle, prvo si "zakucao" graphics, zabranio da se menja, a onda bi da crtas po njemu. Resenje je u tome da u inner klasi ne koristis promenljivu Graphics g nego da dohvatis Graphics i smestis ga u neku drugu promenljivu.
Ali, pazi, getGraphics() vraca null ako Component-a nije prethodno iscrtana na ekranu.
Inace, u konkretnom slucaju, ne postoji ni jedan valjani razlog da klasu My smestis u metod paint(Graphics) ! Nije da pametujem, ali trudi se da u praksi ne pises tako. Izuzetno je tesko snaci se u takvom kodu.
Metod paint(Graphics) poziva se jednom, nakon inicijalizacije. U momentu kad se Componenta iscrtava. Ili, kasnije pozivom metode repaint(). Zato, mislim da treba stvari da postavis upravo obratno nego kako si ti hteo:
"recimo da u metodi paint definiran ono sto mi se treba isrtati.A onda pomocu neke druge metode kada je pozovem na nekom mjestu da mi iscrta ono sto je definirano u metodi paint().. NE ! Nego u konstruktoru i u drugim metodama definises ono sta se treba iscrtati a u metodi paint(Graphics) crtas. Odnosno, posredno pozivas paint(Graphics) pozivom repaint().
To je to. Pisi ako ti nesto nije jasno.
OTPOR blokadi ulica, OTPOR blokiranom Beogradu, OTPOR blokiranoj Srbiji