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

Ko ima strpljenja za metodu paint... a ko ne opusteno

[es] :: Java :: Ko ima strpljenja za metodu paint... a ko ne opusteno

[ Pregleda: 2471 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

flamencoman
Flamencoman
Beograd

Član broj: 46658
Poruke: 11
85.222.163.*



Profil

icon Ko ima strpljenja za metodu paint... a ko ne opusteno15.05.2006. u 11:14 - pre 217 meseci
Pravim jedan od standardnih vizuelnih programa za sortiranje.
Mislim da klasa Node i ArrayNode funkcionisu dobro jer kad pokrenem program niz se iscrtava.
"Problem" je kad se pokrene moja metoda run(NIJE "nit"-thread) i mislim da me zeza metoda repaint() (tj.paint) jer se sortiranje izvrsava ali to se ne vidi (stoji onaj isti pocetni niz);

Medjutim, kada prelazim sa nekim drugim prozorom preko mog glavnog prozora ili kad minimizujem pa vratim prozor vidi se da sortiranje uveliko radi (i to odlicno).

Mislim da treba obratiti paznju na metodu paint u Insertionsort klasi.
Probao sam mnogo varijanti sa metodom paint a saljem poslednju.

Ako neko zeli da pomogne i ima iskustva sa ovakvim stvarima mislim da ce brzo naci problem samo ako prati metode paint u svim klasama i metodu pause() u Insertionsort jer se u njoj trazi pauza i repaint()

Code:

//klasa Node - ona je Ok - iscrtava kvadratic sa brojem
import java.awt.*;

class Node extends Rectangle //Rectangle with number
{

    Node(int i, int j, int k)
    {
        selected = false;
        decided = false;
        base = false;
        n = k;
        reshape(i, j, 25, 20);
    }

    public void paint(Graphics g)
    {
        if(selected)
            g.setColor(selectedColor);
        else
        if(base)
            g.setColor(baseColor);
        else
        if(decided)
            g.setColor(decidedColor);
        else
            g.setColor(normalColor);
        g.fillRect(super.x, super.y, super.width, super.height);
        
        g.setColor(Color.black);
        g.drawRect(super.x, super.y, super.width, super.height);
        
        if(n < 10)
            g.drawString("" + n, super.x + 8, (super.y + super.height) - 3);
        else
            g.drawString("" + n, super.x + 3, (super.y + super.height) - 3);
    }

    static final Color normalColor;
    static final Color selectedColor;
    static final Color baseColor;
    static final Color decidedColor;
    static final int defaultW = 25;
    static final int defaultH = 20;
    boolean selected;
    boolean decided;
    boolean base;
    int n;

    static 
    {
        normalColor = Color.white;
        selectedColor = Color.yellow;
        baseColor = Color.orange;
        decidedColor = Color.red;
    }
}// kraj klase Node

Code:

//Klasa NodeArray - pravi niz kvadratica sa brojevima u njima (taj niz se stampa) - i ovo je Ok
import java.awt.Graphics;

class NodeArray
{

    NodeArray(int i)//i is number of rectangles (nodes)
    {
        init(i);
    }

    void init(int i)
    {
        itemNumber = i;
        node = new Node[i];
        //make new nodes
        for(int j = 0; j < i; j++)
            node[j] = new Node(40 + 25 * j + j, 30, (int)(Math.random() * 100D));

    }

    Node[] nodeList()
    {
        return node;
    }

    void paint(Graphics g)
    {//paint array of nodes
        for(int i = 0; i < itemNumber; i++)
            node[i].paint(g);

    }

    static final int defaultX = 40;
    static final int defaultY = 30;
    private Node node[];
    private int itemNumber;
}//kraj klase NodeArray

Code:

//Klasa Insertionsort- metode u njoj su Ok samo sto se to vidi kada ja prelazim sa drugim otvorenim prozorima 
//preko niza koji se uredjuje- nema druge nego paint-repaint;

import java.awt.Rectangle;
import java.awt.*;

class Insertionsort extends Canvas
{
NodeArray array;
Node ar[];//ovo je nesto sto sam probao pre nego sto sam poslao temu

    Insertionsort()
    {
    }

    void run(Node anode[])
    {ar = anode;//ovo je nesto sto sam probao pre nego sto sam poslao temu
        Node node = new Node(0, 0, 0);
        int i = 0;
        int j = anode.length;
        for(int k = 1; k < j; k++)
        {
            boolean flag = false;
            i = k - 1;
            node = anode[k];
            node.base = true;
            anode[i].selected = true;
            pause();
            if(node.n < anode[i].n)
            {
                moveD(node);
                flag = true;
            }
            while(i >= 0 && node.n < anode[i].n) 
            {
                anode[i].selected = false;
                if(i > 0)
                    anode[i - 1].selected = true;
                move(anode[i], node);
                anode[i + 1] = anode[i];
                anode[i] = node;
                i--;
            }
            if(flag)
                moveUP(node);
            anode[i + 1] = node;
            anode[i + 1].base = false;
            if(i >= 0)
                anode[i].selected = false;
        }

        for(int l = 0; l < j; l++)
            anode[l].decided = true;

        pause();
//        end();
    }

    private void moveD(Node node)
    {
        for(int i = 0; i < 2; i++)
        {
            node.y += 10;
            pause();
        }

    }
  public void paint(Graphics g)
    {        for(int i = 0; i < ar.length; i++) //ovo je nesto sto sam probao pre nego sto sam poslao temu
           ar[i].paint(g);//ovo je nesto sto sam probao pre nego sto sam poslao temu

//array.paint(g); - ni ovo ne radi
    }


    private void moveUP(Node node)
    {
        for(int i = 0; i < 2; i++)
        {
            node.y -= 10;
            pause();
        }

    }

    private void move(Node node, Node node1)
    {
        for(int i = 0; i < 2; i++)
        {
            node.x += 13;
            node1.x -= 13;
            pause();
        }

    }
    
      public  void pause()
    {        
            repaint();
            try
            {
                Thread.sleep(1000);
            }
            catch(InterruptedException interruptedexception) { }        
    }
}//Kraj klase Insertionsort

Code:

//klasa Diplomski :)  "Main class"
import java.awt.*;
import java.awt.event.*;

class Diplomski extends Frame {
NodeArray array = new NodeArray(10);
Insertionsort insertsort = new Insertionsort();

public Diplomski() {
  setSize(600, 600);



  addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
      dispose();
      System.exit(0);
    }
  });
  //array  = new NodeArray(10);
  setVisible(true);
  insertsort.run(array.nodeList());
}

public static void main(String args[]) {
 new Diplomski();

}
public void paint(Graphics g) {
  array.paint(g);
}
}


[Ovu poruku je menjao hyle dana 16.05.2006. u 09:09 GMT+1]
Bolje je i sto puta vratiti se natrag, nego rdjavim putem do kraja ici...
 
Odgovor na temu

tiranin
Dorćol

Član broj: 37185
Poruke: 245
..taman-bg.customer.sbb.co.yu.



Profil

icon Re: Ko ima strpljenja za metodu paint... a ko ne opusteno15.05.2006. u 19:14 - pre 217 meseci
Predlazem ti da kompletan kod stavis u neki zip fajl i stavis uz poruku, ovako su se izgubili indeksi (u uglastim zagradama), posto npr slovo i u uglastim zagradama ES tretira kao italic, i kad pogledas kako ti izgleda source vidis da nigde nema
Code:
node[i]

A, veruj mi , ako neko hoce da ti pomogne, ne bi trebalo da se muci da kompajlira kod.
 
Odgovor na temu

flamencoman
Flamencoman
Beograd

Član broj: 46658
Poruke: 11
*.sbb.co.yu.



Profil

icon Re: Ko ima strpljenja za metodu paint... a ko ne opusteno15.05.2006. u 20:45 - pre 217 meseci
hvala, nisam obratio paznju...
Bolje je i sto puta vratiti se natrag, nego rdjavim putem do kraja ici...
 
Odgovor na temu

hyle
Perica Milošević
Belgrade

Član broj: 30030
Poruke: 150
82.117.193.*

Sajt: www.linkedin.com/in/peric..


+4 Profil

icon Re: Ko ima strpljenja za metodu paint... a ko ne opusteno16.05.2006. u 08:52 - pre 217 meseci
Nisi trebao "ručno" da pozivaš repaint(). Postoji Thread koji je zadužen za isctavanje i forme i taj posao prepuštaš njemu, tvoje je bilo samo da ga obavestiš da na formi ima promena kako bi znao da je potrebno iscrtavanje. U slučaju kada si prevlačio neki drugi prozor preko tvog, tvoj program je dobijao poruke da je potrebno da uradi iscrtavanje dela svog prozora i onda je prikazivana trenutna slika tvog programa, tj. trenutno stanje sortiranja.

Probaj da uradiš sledeće.
Za tvoju klasu Insertionsort reci da implementira Runnable interfejs (to ti ne zahteva bitnu izmenu pošto ta klasa već ima metodu run, moraćeš samo iz metode run da izbaciš parametre i da te parametre proslediš preko konstruktora):
Code:

class Insertionsort extends Canvas implements Runnable


U konstruktoru klase Diplomski umesto reda:
Code:

insertsort.run(array.nodeList());


postavi sledeće:
Code:

Insertionsort insertsort = new Insertionsort(array.nodeList());
EventQueue.invokeAndWait(insertsort);


Nisam se udubio u tvoj kod za sortiranje i za iscrtavanje ali pretpostavljam da je problem u ovome što sam ti rekao.

Ako te zanima zbog čega to funkcioniše na taj način možeš početi odavde:
What exactly is the "Event Dispatch" thread (aka "AWT" Thread)?
Threads and Swing


Pozdrav
 
Odgovor na temu

flamencoman
Flamencoman
Beograd

Član broj: 46658
Poruke: 11
*.sbb.co.yu.



Profil

icon Re: Ko ima strpljenja za metodu paint... a ko ne opusteno16.05.2006. u 20:52 - pre 217 meseci
Pokusacu da prepravim kod, hvala puno...
Javicu da li je proradilo.
Palo mi je i na pamet da prva klasa koja isrtava jedan kvadratic sa brojem nije izvedena iz Canvas pa zato ne radi repaint() jer on treba da osvezi Canvas.I to cu pokusati.
Pozdrav i jos jednom hvala...
Bolje je i sto puta vratiti se natrag, nego rdjavim putem do kraja ici...
 
Odgovor na temu

Java Beograd
Novi Beograd

Član broj: 11890
Poruke: 9446
..yu.220.247.194.in-addr.arpa.



+10246 Profil

icon Re: Ko ima strpljenja za metodu paint... a ko ne opusteno17.05.2006. u 11:54 - pre 217 meseci
metod paint(Graphics g) je sistemski asinhron metod. Dakle, UVEK se paint radi u posebnom thred-u, nezavisno od ostalog toka. To ume prilicno da pomrsi konce. Jedan od nacina da se to izbegne je off screen crtanje.
OTPOR blokadi ulica, OTPOR blokiranom Beogradu, OTPOR blokiranoj Srbiji
 
Odgovor na temu

flamencoman
Flamencoman
Beograd

Član broj: 46658
Poruke: 11
85.222.163.*



Profil

icon Re: Ko ima strpljenja za metodu paint... a ko ne opusteno17.05.2006. u 15:58 - pre 217 meseci
Proradilo je. Napravio sam katastrofalnu gresku direktnim pozivanjem metode paint() iz glavnog prozora;
Nasledio sam klasu NodeArray iz Canvas i prepravio sam konstruktor InsertationSort i metodu run i sada radi.
Sada imam problem sa treperenjem i ne radi mi preklopljena metoda update.
Pokusacu to da sredim u narednom periodu a ako ne uspem eto mene opet.
Hvala puno svima, puno ste mi pomogli...
Bolje je i sto puta vratiti se natrag, nego rdjavim putem do kraja ici...
 
Odgovor na temu

[es] :: Java :: Ko ima strpljenja za metodu paint... a ko ne opusteno

[ Pregleda: 2471 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

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