Sortieralgorithmus graphisch darstellen

Messoras

Aktives Mitglied
Hallo Leute,
Erstmal sorry, dass ich das Thema nochmal aufgemacht habe, obwohl es schon mal vorkam, allerdings passten die Lösungsvorschläge nicht zu meinem Problem.
Also ich habe ein Array aus ints. Dieses wird im Programm auf einem JFrame in Form eines Graphen und in einer Tabelle dargestellt.
Ich habe verschiedene Buttons um verschiedene Sortieralgorithmen auf das Array anzuwenden, alle funktionieren, aber wenn ich sie aktiviere habe ich hinterher nur die sortierte Form des Arrays auf dem JFrame...
Für mein Referat würde ich die Reihenfolge der Schritte allerdings gerne sichtbar machen.
Das Hauptprogramm erbt von einem Thread.

Es gibt folgende globale Instanzen (spielen hier aber an sich keine Rolle):
Java:
    int[] array;
    public JButton neu, merge, quick, insert;
    public MyFrame frame;

Die Klasse MyFrame:
Java:
    class MyFrame extends JFrame {
        public MyFrame (String s) {
            super(s);
        }

        public void paint(Graphics g) {
            g.setColor(new Color(230,230,220));
            g.fillRect(0,0,getWidth(),getHeight());
            //Graph
            g.setColor(Color.white);
            g.fillRect(80,100,array.length*10,array.length*10);
            g.setColor(Color.black);
            g.drawRect(80,100,array.length*10,array.length*10);
            for (int i = 0; i < array.length; i++) {
                g.fillRect(80+i*10,100+array.length*10-(array[i]*10),10,10);
            }
            g.drawString("Index",array.length*10,120+array.length*10);
            g.drawString("Wert",50,150);

            //Stapel
            for (int i = 0; i < array.length; i++) {
                g.drawRect(200+array.length*10,50+i*30,100,25);
                g.drawString("Wert ["+i+"] = "+array[i],210+array.length*10,70+i*30);
            }
        }
    }


Ich habe das ganze so probiert:
(Beispiel Insertionsort)
Java:
    public void insertionsort(int[] num)
    {
        int j;
        int key;
        int i; 

        for (j = 1; j < num.length; j++)
        {
            key = num[ j ];
            for(i = j - 1; (i >= 0) && (num[ i ] > key); i--)
            {
                num[ i+1 ] = num[ i ];
            }
            num[ i+1 ] = key;
             try {
                frame.repaint();
                sleep(500);
            } catch(Exception e) {
                 e.printStackTrace();
            }
        }
    }

Aber so wartet das Programm einfach nur ein paar Sekunden und zeigt dann das fertig sortierte Array an.
Könnt ihr mir verraten, was ich falsch gemacht habe, oder wie ich das besser machen könnte?

Gruß Messoras
 
Zuletzt bearbeitet:
Es sieht aber auf jeden Fall so aus, als hätte die repaint Methode ein Problem mit dem Thread.
Wenn ich statt repaint() zB. etwas von der Konsole ausgeben lasse, funktioniert es richtig.
Ich kann auch in die Direkteingabe zB.
Java:
Sortieralgorithmen s = new Sortieralgorithmen();
s.insertionsort(s.array);
eingeben, dann läuft das Programm, so wie es soll.
Ich denke ich muss die paint- oder die Sortiermethode in einen anderen Thread verlagern.
Wie mache ich das?
Ich habe schon versucht die Sortieralgorithmen in eine neue Klasse zu schieben, die von einem Thread erbt, aber da habe ich wieder das Problem, dass erst nach der Wartezeit repaintet wird...

Gruß Messoras
 
Das Sortieren sollte im Hintergrund stattfinden. Am besten nimmst du dafür einen Swingworker. Wenn Du einen Sortierschritt gemacht hast, dann rufst du ein Update im MainThread auf und wartest im Hintergrundthread ein wenig. Dann sollte der MainThread auch nachkommen mit dem neu Zeichnen.

Gruß

Claus
 
Ich hab leider überhaupt keinen Plan von Swingworkern...
Ich dachte ich muss das irgendwie mit Threads regeln? :S
Wie muss ich das machen?

Gruß Messoras
 

Zurück
Oben