[ flamencoman @ 15.05.2006. 11:14 ] @
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]
[ tiranin @ 15.05.2006. 19:14 ] @
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.
[ flamencoman @ 15.05.2006. 20:45 ] @
hvala, nisam obratio paznju...
[ hyle @ 16.05.2006. 08:52 ] @
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
[ flamencoman @ 16.05.2006. 20:52 ] @
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...
[ Java Beograd @ 17.05.2006. 11:54 ] @
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.
[ flamencoman @ 17.05.2006. 15:58 ] @
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...