[ EXeX @ 29.03.2004. 16:02 ] @
Evo imam sljedeci jednostavan kod:

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(final Graphics g)
{

class My extends TimerTask
{
public void run()
{
g.drawLine(0,0,100,100);
}
}

Timer timer = new Timer();
timer.schedule(new My(),0,1000);
}
public static void main(String args[])
{
new Test();
}
}

Dakle ja ovdje pokusavam da iscrtam liniju svake sekunde,pomocu tajmera.
Jest da ovaj primjer nema prakticnog smisla,ali mene zanima zasto mi se nece nista
iscrtati kada koristim Timer.
Napomena,gore u metodi paint Graphics parametar je koristen kao final jer ga
koristim u pod klasi My,ali nije ni to problem,npr kad kreiram objekt klase My my=new My() i pokrenem metodu my.run() onda radi,ali ako idem preko Tajmera kao gore,nece da radi,tj nista mi se nece iscrtati.Molio bi ako neko zna u cemu je problem.
Hvala unaprijed.
[ EXeX @ 29.03.2004. 16:07 ] @
Zanima me jos jedna stvar,a to je 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().Da li je to moguce,i da li postoji takva metoda.Tada u tom slucaju nebi morao Timer objekt stavljati u Paint metodu.
Hvala.
[ Java Beograd @ 30.03.2004. 10:20 ] @
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.


[ EXeX @ 30.03.2004. 10:52 ] @
E care evo gledam ovo tvoje i to je OK nisam jos probo,idem probati i vjerujem da ce raditi.
Ja sam takodjer pretpostavio da je problem u final argumentu,ali nisam znao kako da rijesim jer nisam toliko upoznao Javu i njen API toliko pa nisam znao koju metodu da upotrijebim.U svakom slucaju kako god bilo nepametujes,jer je svaki komentar dobro dosao,hvala jos jednom.