Sortieralgorithmus grafisch darstellen

ChristianEG

Mitglied
Aloha,

ich arbeite gerade daran mehrere Sortieralgorithmen (BubbleSort, SelectionSort und InsertionSort) grafisch darzustellen. Ich habe erstmal eine einfache GUI mit JFrame und verschachtelten JPanels gebaut. Zunächst habe ich den BubbleSort in die GUI eingebunden. Dieser sortiert 10 Zufallszahlen der reihe nach. Das funktioniert soweit auch gut. Jede Zahl bekommt einen Button und wird so dargestellt.

Allerdings würde ich das ganze etwas anschaulicher machen. Man soll quasi in einzelnen Schritten sehen was passiert. Bisher wird einfach das "ganze" dem Anwender vorgeknallt.

Mein Plan war es erstmal alle 10 Zufallszahlen anzuzeigen. Danach sollen die Sortierschritte nach und nach angezeigt werden. Ich habs daher mal primitiv mit einem Thread.sleep(xx) nach der Erzeugung eines neuen Buttons probiert. Allerdings tut sich da nichts. Ich hab jetzt auch schon länger nicht mehr Programmiert und hänge da gerade total fest. Kann mir jemand weiterhelfen? Bin auch für Verbesserungsvorschlänge des restlichen Codes dankbar, da kann man sicherlich einiges anders und besser machen!

Hier der Code:

Klasse SGMain
Java:
package sortguipckg;

public class SGMain {

    public static void main(String[] args) {
	SGFrame sgf = new SGFrame();
    }
}

Klasse SGFrame
Java:
package sortguipckg;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class SGFrame extends JFrame {

    private static final long serialVersionUID = 1L;
    JPanel oben = new JPanel();
    JPanel unten = new JPanel();
    JPanel unten2 = new JPanel();
    
    public class MyInnerClassActionListener implements ActionListener {
	public void actionPerformed(ActionEvent e) {
	    if("BubbleButton".equals(e.getActionCommand())) {
	    }
	}
    }
    
    public SGFrame() {
	super("Sortier Algorithmen");
	setSize(600, 800);
	setResizable(false);
	Container MainContainer = getContentPane();
	GridBagLayout gbl = new GridBagLayout();
	MainContainer.setLayout(gbl);
	GridBagConstraints gbc = new GridBagConstraints();
	
	oben.setLayout(new GridLayout(1,0));
	gbc.gridx = 0; // x-Position im gedachten Gitter
	gbc.gridy = 0; // y-Position im gedachten Gitter
	gbc.fill = GridBagConstraints.HORIZONTAL;
	gbl.setConstraints(oben, gbc);
	
	unten.setLayout(new GridLayout(0,1));
	gbc.gridx = 0; // x-Position im gedachten Gitter
	gbc.gridy = 1; // y-Position im gedachten Gitter
	gbc.fill = GridBagConstraints.HORIZONTAL;
	gbl.setConstraints(unten, gbc);
	
	unten2.setLayout(new GridLayout(0,10));
	gbc.gridx = 0;
	gbc.gridy = 2;
	gbc.fill = GridBagConstraints.HORIZONTAL;
	gbl.setConstraints(unten2, gbc);
	
	JLabel jl = new JLabel("Sortier Algorithmus: ");
	
	SGButtons BubbleButton = new SGButtons("BubbleSort");
	BubbleButton.addActionListener(new MyInnerClassActionListener());
	BubbleButton.setActionCommand("BubbleButton");
	
	add(oben);
	add(unten);
	oben.add(jl);
	oben.add(BubbleButton);
	unten.add(unten2);
	
	setDefaultCloseOperation(EXIT_ON_CLOSE);
	pack();
	setVisible(true);
    }
    
    public void BubbleSort() {
	SGBubbleSort.BSErstelleZufallsZahlen();
	for (int i=0; i<SGBubbleSort.Zufallszahlen.length; i++) {
	    SGButtons ButtonX = new SGButtons("");
	    ButtonX.setText(SGBubbleSort.Zufallszahlen[i] + "");
	    unten2.add(ButtonX);
	}
	//System.out.println("Generierte Zufallszahlen " + java.util.Arrays.toString(SGBubbleSort.Zufallszahlen));
	do { 
	    SGBubbleSort.BSTauscheZahlen();
	    for (int i=0; i<SGBubbleSort.Zufallszahlen.length; i++) {

		SGButtons ButtonY = new SGButtons("");
		ButtonY.setText(SGBubbleSort.Zufallszahlen[i] + "");
		unten2.add(ButtonY);
	    }
	    SGBubbleSort.BSVergleiche();
	} while (SGBubbleSort.match < SGBubbleSort.AnzahlZahlen);
	unten2.revalidate();
	pack();
    }
 }

Klasse SGBubbleSort
Java:
package sortguipckg;

public class SGBubbleSort {

    static int Zufallszahlen[] = new int [10];
    static int SortZufallszahlen[] = new int [Zufallszahlen.length];
    static int AnzahlZahlen = Zufallszahlen.length;
    static int Buffer1;
    static int Buffer2;
    static int match=0;
    static int counter=0;
	
    public static void BSErstelleZufallsZahlen() {
	for (int i=0; i<AnzahlZahlen; i++) {
	    Zufallszahlen[i] = (int) ((Math.random())*(Zufallszahlen.length));
	}
	
	for (int i=0; i<AnzahlZahlen; i++) {
	    SortZufallszahlen[i] = Zufallszahlen[i];	
	}
	java.util.Arrays.sort(SortZufallszahlen);
    }
	
    public static void BSTauscheZahlen() {
	for (int i=0; i<Zufallszahlen.length-1; i++) { 
	    if(Zufallszahlen[i] > Zufallszahlen[i+1]) { 
		Buffer1 = Zufallszahlen[i];
		Buffer2 = Zufallszahlen[i+1];
		Zufallszahlen[i] = Buffer2;
		Zufallszahlen[i+1] = Buffer1;
	    }	
	}		
    }
		
    public static void BSVergleiche() {
	for (int i=0; i<AnzahlZahlen; i++) {
	    if (Zufallszahlen[i] == SortZufallszahlen[i]) {
		match = match + 1;
	    } 
	}
	if (match<AnzahlZahlen) {
	    match = 0;
	}
    }
	
   /* public static void main(String[] args) {	
	BSErstelleZufallsZahlen();
	System.out.println("Generierte Zufallszahlen  " + java.util.Arrays.toString(Zufallszahlen));
	System.out.println("Sortierte Zufallszahlen   " + java.util.Arrays.toString(SortZufallszahlen));
	
	do { 
	    BSTauscheZahlen();
	    System.out.println(java.util.Arrays.toString(Zufallszahlen));
	    BSVergleiche();
	} while (match < AnzahlZahlen);
    }	*/	
}

Klasse SGButtons
Java:
package sortguipckg;

import javax.swing.JButton;

public class SGButtons extends JButton {
    
    SGButtons(String text) {
	super(text);
    }
}

Liebe Grüße,

Christian
 
Ein Beispiel :
Java:
for ( int = nummer ; nummer < 10 ; nummer ++ )
{
      Thread.sleep(1000); // 1 Sekunde 
       System.out.println( "Nummer ist: "+Nummer ) ;
       // Mache nach 1 Sekunden den nächsten Schritt 


}

Also beim bubblesort soll er z.B die nächste Zahl tauschen.
Und die Änderung von den Buttons gleich mit ändern.
Java:
 JButton.setText( ""+Nummer  );
 
Hallo,

danke für den Tipp!!

Hab das mal eingefügt. Habe das so gemacht:

Java:
	    for (int i=0; i<SGBubbleSort.Zufallszahlen.length; i++) {
		    Thread.sleep(1000);
		    SGButtons ButtonY = new SGButtons("");
			ButtonY.setText(SGBubbleSort.Zufallszahlen[i] + "");
			unten2.add(ButtonY);
	    }

Funktioniert leider nicht so wirklich. Wenn ich jetzt den BubbleSort aufrufe bleibt die JavaApp einfach 10 Sekunden hängen und beendet sich dann. Was mache ich falsch?

Gruss,

Christian
 
Hallo .
Hier mal ein Beispiel:

Java:
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Beispiel extends Thread {

    private JButton button;
    private JButton button2;
    private JButton button3;
    private JButton button4;

    int sortiereMich[] = {3,1,6,4};
    int tmp = 0 ;
    boolean fertig = false;

    public Beispiel()
    {

        button = new JButton(""+sortiereMich[0]);
        button2 = new JButton(""+sortiereMich[1]);
        button3 = new JButton(""+sortiereMich[2]);
        button4 = new JButton(""+sortiereMich[3]);

        initComponents();

        
    }

    public void initComponents()
   {
        JFrame frame = new JFrame("Änder Zahl");
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        frame.setBounds(0, 0, 300, 80);

        JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEADING));
        panel.add(button);
        panel.add(button2);
        panel.add(button3);
        panel.add(button4);
        
        frame.add(panel);
        frame.setVisible(true);
    }

    @Override
    public void run()
    {
        while(!fertig)
        {
            try
            {
                for(int i = 1; i < sortiereMich.length;i++)
                {
                    Thread.sleep(1000);
                    if(sortiereMich[i] < sortiereMich[i-1])
                    {
                        tmp = sortiereMich[i];
                        sortiereMich[i] = sortiereMich[i-1];
                        sortiereMich[i-1] = tmp;
                    }
                    
                    button.setText(""+sortiereMich[0]);
                    button2.setText(""+sortiereMich[1]);
                    button3.setText(""+sortiereMich[2]);
                    button4.setText(""+sortiereMich[3]);
                }
                fertig = true;
            }
            catch( InterruptedException e)
            {
                System.out.println(e.getMessage());
            }

        }
    }

    public static void main(String[] args) {
        new Beispiel().start();
    }
}

Und dort kannst du dann nachvollziehen wie er per Bubblesort sortiert 🙂

Mfg
 

Neue Themen


Zurück
Oben