Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Problem sa Timer-om

[es] :: Java :: Problem sa Timer-om

[ Pregleda: 2202 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

EXeX

Član broj: 20651
Poruke: 166
*.cmu.carnet.hr



Profil

icon Problem sa Timer-om29.03.2004. u 16:02 - pre 243 meseci
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.

eX
 
Odgovor na temu

EXeX

Član broj: 20651
Poruke: 166
*.cmu.carnet.hr



Profil

icon Re: Problem sa Timer-om29.03.2004. u 16:07 - pre 243 meseci
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.
eX
 
Odgovor na temu

Java Beograd
Novi Beograd

Član broj: 11890
Poruke: 9448
217.26.79.*



+10246 Profil

icon Re: Problem sa Timer-om30.03.2004. u 10:20 - pre 243 meseci
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
 
Odgovor na temu

EXeX

Član broj: 20651
Poruke: 166
*.cmu.carnet.hr



Profil

icon Re: Problem sa Timer-om30.03.2004. u 10:52 - pre 243 meseci
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.
eX
 
Odgovor na temu

[es] :: Java :: Problem sa Timer-om

[ Pregleda: 2202 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.