BubbleSort mit Hilfe einer Balkengrafik visualisieren

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,

ich möchte den BubbleSort Algorithmus mit Hilfe einer Balkengrafik darstellen.
Die Höhe der Balken stellt die Größe einer Zahl dar.
Nach jedem Vertauschvorgang soll nun die Balkengrafik neu gezeichnet werden.
Habe bis jetzt folgenden Code dazu, mit dem ich aber alles andere als zufrieden bin.
Denn:

- ich kann die Methode repaint() nicht aus der Klasse BubbleSort aufrufen.
- irgendwie unsauber programmiert

Wer kann mir helfen, so dass ich auch die Methode repaint() aus der Klasse BubbleSort aufrufen kann.
Und dem Algorithmus ohne viel Aufwand weitere Sortieralgorithmen hinzufügen kann.

Hier erstmal mein Code:
Code:
package gui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.image.ImageObserver;
import java.text.AttributedCharacterIterator;

import javax.swing.JComponent;

public class MeinCanvas extends JComponent {
    
    Graphics mG = getGraphics();
    MeinRandom random = new MeinRandom();
    BubbleSort verbBubble = new BubbleSort();
    QuickSort verbQuick = new QuickSort();
    
    int[] array = new int[100];
    int[] array1 = new int[100];
    
    
    protected int
            breite,
            hoehe;
    
    public MeinCanvas(int breite,int hoehe) {
        this.hoehe = hoehe;
        this.breite = breite;
        
        
        // fülle arrays mit Zufallszahlen von 1-100
        for (int i = 0; i < array.length; i++) {
            
            array[i] = random.nextInt(1, 100);
        }
        array1 = array.clone();
        sortieren();
    }
    
    
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(breite,hoehe);
    }
    
    @Override
    public Dimension getSize(Dimension arg0) {
        return new Dimension(breite,hoehe);
    }
    
    @Override
    public Dimension getMinimumSize() {
        return getPreferredSize();
    }

    
    
    @Override
    public void paint(Graphics g) {
        //Farbe vom rectangle
        g.setColor(Color.white);
        g.fillRect(0,0,breite,hoehe);  //wie weit des rectangle mit der farbe (weiß) gefüllt werden soll
        
        
        g.setColor(Color.black);
        g.setFont(new Font("SansSerif",Font.BOLD,12));
        //Überschrift
        //g.drawString("Zeichenfläche",2,23);
        
        int abstandLinks = 0;
        
        //zeichne Balken zu den Zufallszahlen im array
        //Balken ,hoehe-... und letzte zahl müssen immer gleich sein!
        for (int i = 0; i < array.length; i++) {
            
            g.fillRect(abstandLinks, hoehe-array[i], 3, array[i]);
            abstandLinks = abstandLinks +5;
            
        }
               
        
        //int liObX = 160;
        //int liObY = 0;
        //int reUnX = 6;
        //int reUnY = hoehe;
        //g.drawRect(liObX, liObY, reUnX, reUnY);
        
        g.setColor(Color.black);
        g.draw3DRect(0,0,breite-1,hoehe-1,true); // schwarzer rand vom weißen feld
        
        g.setColor(Color.black);
        g.draw3DRect(300,400,150,150,true);
        
        
        
        /* 
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
        */
        sortieren();
    }
    
    public void sortieren() {
        
        verbBubble.bubbleSort(array);
        repaint();
        
    }
    
    
}

Code:
package gui;

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.HeadlessException;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GrafikFenster extends JFrame {
    
    protected JButton
            btStart = new JButton("start"), // Button "Start"
            btStop = new JButton("stop");   // Button "Stop"
    
    //	 Konstruktor
    public GrafikFenster() throws HeadlessException {
        this("Hauptfenster");
    }
    
    
    //	 Konstruktor
    public GrafikFenster(String arg0) throws HeadlessException {
        super(arg0);
        this.setLocation(200, 200); //platzierung vom fenster
        this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); // Schließmechanismus
        
        Container cpane = this.getContentPane();
        GridBagLayout grid = new GridBagLayout();
        cpane.setLayout(grid);
        
        // ---------------------------------------------
        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS));
        buttonPanel.add(btStart);
        buttonPanel.add(btStop);
        buttonPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
        
        addComponent(cpane,buttonPanel,0,10,GridBagConstraints.REMAINDER,1);
        
        // ---------------------------------------------
        JPanel drawPanel = new JPanel();
        //System.out.println("OK4");
        MeinCanvas canvas = new MeinCanvas(505,100); // Breite / Hoehe
        drawPanel.add(canvas);
        drawPanel.setBorder(BorderFactory.createLineBorder(Color.black));
        
        addComponent(cpane,drawPanel,10,200,GridBagConstraints.REMAINDER,1);
        
        //canvas.repaint();
        
        // alles schön packen
        this.pack();
    }
    

    
    //	 Hilfsmethoden zum Hinzufuegen von Komponenten zu GridBagLayout
    protected void addComponent(Container container,
            Component component, int gridx, int gridy,
            int gridwidth, int gridheight) {
        addComponent(container,component,gridx,gridy,
                gridwidth,gridheight,GridBagConstraints.WEST);
    }
    
    protected void addComponent(Container container,
            Component component, int gridx, int gridy,
            int gridwidth, int gridheight,
            int anchor) {
        GridBagConstraints constr = new GridBagConstraints();
        constr.gridx = gridx;
        constr.gridy = gridy;
        constr.gridwidth = gridwidth;
        constr.gridheight = gridheight;
        constr.fill = GridBagConstraints.NONE;
        constr.anchor = anchor;
        
        container.add(component, constr);
    }
    
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        GrafikFenster fenster = new GrafikFenster();
        fenster.setVisible(true);
    }
    
}

Code:
package gui;

import java.security.spec.MGF1ParameterSpec;

//import javax.swing.RepaintManager;

public class BubbleSort {
    
    public int y = -1;
    //MeinCanvas can = new MeinCanvas(400,100);
    public int[] bubbleSort(int array[])
    
    
// pre: array is full, all elements are valid integers (not null)
// post: array is sorted in ascending order (lowest to highest)
    {
        boolean swappedOnPrevRun = true;
        while(swappedOnPrevRun) {
            swappedOnPrevRun = false;  // this variable keeps track of whether to continue sorting or exit
            
            
            for( ; y < array.length -1; y++)	// loop through every element in the array,
                // except for the last one
                
            {
                
                y++;
                if (y > 98) {
                    y = 0;
                }
                if(array[y] > array[y + 1])		// if current element is greater than the next
                {
                    // swap the two elements
                    swappedOnPrevRun = true;	// we don't want the loop to end just yet, we're not done
                    int temp = array[y];		// store element i in a temporary variable
                    array[y] = array[y + 1];	// set element i+1 to where i used to be
                    array[y + 1] = temp;		// release the old i from temp into i+1 slot
                    
                    return array;
                }
                
                try {
                    Thread.sleep(1);
                    //can.sortieren();
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
                //can.sortieren();
                break;
                
            }
        //break;
        }
        return array;
    }
    
}
 
G

Guest

Gast
jaa danke, aber hilft mir im moment noch nicht weiter!

Wie kann ich denn verdammt nochmal aus der klasse BubbleSort die repaint() methode aufrufen?
Ich bekomm das nicht hin!
 

Marco13

Top Contributor
Code:
    BubbleSort verbBubble = null;
    QuickSort verbQuick = new QuickSort();
   
...
    public MeinCanvas(int breite,int hoehe) {
        this.hoehe = hoehe;
        this.breite = breite; 
        verbBubble  = new BubbleSort(this); //--------------------------- Canvas übergeben

public class BubbleSort {

    private MeinCanvas meinCanvas = null;
   
    public BubbleSort(MeinCanvas meinCanvas)
    {
        this.meinCanvas=meinCanvas;  //--------------------------- Canvas speichern
    }



    public int[] bubbleSort(int array[])
    {
         ...
         meinCanvas.repaint();  //--------------------------- Canvas repainten
...

Es gibt aber noch andere (evtl. auch "bessere") Alternativen (Model-View-Controller-Pattern oder so...)
 
G

Guest

Gast
@Marco13

super genau das brauchte ich, jetzt geht es schonmal mit dem aufruf von repaint() aus bubblesort.
 
G

Guest

Gast
wie bekomme ich denn den methodenaufruf sortieren() aus der paint() methode raus?

Ich möchte, dass wenn er die paint methode abgearbeitet hat wieder in den BubbleSort Algorithmus reinspringt!?
 
G

Guest

Gast
PROBLEM:

er aktualisiert die ansicht nur aufgrund des returns im Bubblesort (return array).
das ganze funktioniert im moment auch ohne den repaint aufruf aus bubblesort.
Ich will aber das es mit repaint funktioniert?
Also ich bin ratlos...????
 

Marco13

Top Contributor
Ich nehme an, dass du bubblesort startest, wenn z.B. ein Button geklickt wurde, und das ganze im Event-Dispatch-Thread gemacht wurde, und du es eigentlich in einem eigenen Thread machen müßtest (gäääähhhn...) aber mangels aussagekräftigem Code ist das natürlich nur geraten.
 
G

Guest

Gast
ja es sollte ursprünglich so werden, dass wenn ich den button drücke bubblesort startet. Aber der button ist im moment noch ohne funktion!
Das sind bis jetzt alle klassen zum programm! :shock:
Was vermisst du denn?

Ja genau es sollte im prinzip alles übern thread laufen.
 

Marco13

Top Contributor
Wahrg - hab grad nochmal drübergeschaut: Die sortieren-Funktion in der paint-Methode aufzurufen ist gröbster Unfug - aber das war ja auch deine Frage :wink: Die sortieren-Funktion wird ja auch im Konstruktor schonmal aufgerufen. EIN Aufruf sollte ja eigentlich reichen. Allerdings sollte der auch nicht im Konstruktor des Canvas gemacht werden. (Dass die Sortierer im Canvas liegen ist auch ziemlich häßlich, aber ... du wolltest dir ja keine Inspiration von dem Link holen, den ich gepostet hatte (machmal habe ich den Eindruck, die Leute glauben, man würde irgendwelche Antworten nicht schreiben, um jemandem zu helfen, sondern weil einem so schrecklich langweilig ist....)).


Also: Rufe an einer geeigeneten Stelle
Code:
Thread t = new Thread(new Runnable()
{
    public void run()
    {
        sortierer.sortieren();
    }
});
t.start();
auf. Welches die "geeignete Stelle" ist, darfst du selbst herausfinden. Im Konstruktor würde es vmtl. schon gehen, aber schön wäre das nicht.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Hilfe bei dem Erstellen einer SQL Abfrage aus gewählten JComboBoxen AWT, Swing, JavaFX & SWT 5
JavaBeginner22 Button Hilfe AWT, Swing, JavaFX & SWT 0
ExceptionOfExpectation Textdarstellung auf einem Canvas mit Hilfe von repaint(); AWT, Swing, JavaFX & SWT 6
senol JOptionPane hilfe!!! :(((( AWT, Swing, JavaFX & SWT 32
donnico2 Objekte in der GUI ausgeben mit Hilfe einer DAO AWT, Swing, JavaFX & SWT 1
J Swing Hilfe bei Layout AWT, Swing, JavaFX & SWT 2
Zrebna JavaFX-Projekt mit Bildern funktioniert nicht - um Hilfe wird gebeten AWT, Swing, JavaFX & SWT 14
F BorderLayout Hilfe bei Anzeige AWT, Swing, JavaFX & SWT 2
J Hilfe beim tablevies AWT, Swing, JavaFX & SWT 2
T Swing Hilfe - Selbst Informatik Lehrer konnte mir nicht weiter Helfen AWT, Swing, JavaFX & SWT 2
W Swing Hilfe beim Einbinden von Bildern in einem JFrame AWT, Swing, JavaFX & SWT 8
A Swing TicTacToe-Bitte um Hilfe AWT, Swing, JavaFX & SWT 32
T Bitte um Hilfe AWT, Swing, JavaFX & SWT 2
T Hilfe bei Code AWT, Swing, JavaFX & SWT 2
S Hilfe bei Java Gui Anfänger AWT, Swing, JavaFX & SWT 5
J Warum geht das nicht? if-else usw..... compilieren geht nicht -- HILFE!!! AWT, Swing, JavaFX & SWT 10
M Problem mit Layoutmanagern... Hilfe wäre sehr nett. AWT, Swing, JavaFX & SWT 2
T Hilfe was mus ich tun um das fertige JfxFenster zu sehen AWT, Swing, JavaFX & SWT 2
R Hilfe beim ändern des Hintergrundes eines JFrames AWT, Swing, JavaFX & SWT 9
A hilfe für flowlayout AWT, Swing, JavaFX & SWT 6
N Swing Benötige Hilfe um ein Swing Canvas zu speichern AWT, Swing, JavaFX & SWT 4
X Swing JButton's zum JScrollPane hinzufügen geht nicht. Bitte um Hilfe. AWT, Swing, JavaFX & SWT 9
C Gesucht: Hilfe beim programmieren. AWT, Swing, JavaFX & SWT 1
V Swing Brauche Hilfe mit Label AWT, Swing, JavaFX & SWT 3
C Hilfe beim programmieren mit studiumgebundenes Projekt AWT, Swing, JavaFX & SWT 1
T Swing JTable Zeile mit ausgelesenen Werten mit Hilfe von einem Button hinzufügen AWT, Swing, JavaFX & SWT 1
A JavaFX Hilfe beim Design eines Quiz AWT, Swing, JavaFX & SWT 2
H Swing Hilfe bei GUI AWT, Swing, JavaFX & SWT 4
T HILFE wie lösche ich gezeichnetes per tastendruck AWT, Swing, JavaFX & SWT 1
R Swing JOptionPane Fehlermeldung- bitte um Hilfe! AWT, Swing, JavaFX & SWT 4
Tausendsassa ImageIcon?! Hilfe! AWT, Swing, JavaFX & SWT 10
C Hilfe bei JSpinner und JList AWT, Swing, JavaFX & SWT 1
J GridBagLayout mit Hilfe einer For-Schleife befüllen AWT, Swing, JavaFX & SWT 1
M Hilfe bei Performanceverbesserung AWT, Swing, JavaFX & SWT 34
B Hilfe welches Layout brauch ich AWT, Swing, JavaFX & SWT 4
M SwingWorker Hilfe! AWT, Swing, JavaFX & SWT 10
K Swing Brauche Hilfe AWT, Swing, JavaFX & SWT 6
O AWT Performance und Bug behebung[brauche Hilfe] AWT, Swing, JavaFX & SWT 2
K Swing Konsolen Programm in GUI - Suche Hilfe bei Konsolenausgabe AWT, Swing, JavaFX & SWT 2
K Viele Textfield mit Hilfe eines MousListener leeren - möglich? AWT, Swing, JavaFX & SWT 8
I ausgewählte Zeile mit Hilfe der Tastatur löschen! AWT, Swing, JavaFX & SWT 3
Kenan89 Java FX GUI Hilfe für erste Java FX App AWT, Swing, JavaFX & SWT 8
B Rechteck Mit Hilfe Von Timeline, KeyFrames animieren AWT, Swing, JavaFX & SWT 3
J LayoutManager Hilfe bei Wahl des Layouts AWT, Swing, JavaFX & SWT 9
F Hilfe beim ausschalten von Robot AWT, Swing, JavaFX & SWT 7
N Hilfe bei Memory-Spiel AWT, Swing, JavaFX & SWT 18
L Swing Hilfe bei JTabelModel gesucht AWT, Swing, JavaFX & SWT 4
B Hilfe zu JTable und JTabbedPane AWT, Swing, JavaFX & SWT 18
K Hilfe bei Labels AWT, Swing, JavaFX & SWT 3
S Hilfe beim Lernprozess von java3d AWT, Swing, JavaFX & SWT 20
T JLayeredPanel - Hilfe AWT, Swing, JavaFX & SWT 7
C Swing Hilfe bei umsetzung eines Stundenplans. AWT, Swing, JavaFX & SWT 7
K Swing Hilfe beim JTree! AWT, Swing, JavaFX & SWT 3
N Hilfe bei Panels! AWT, Swing, JavaFX & SWT 11
F Swing Syntaxhighlighting Hilfe AWT, Swing, JavaFX & SWT 5
Jats Bitte um Hilfe bei JComboBox mit Array AWT, Swing, JavaFX & SWT 6
Jats Hilfe bei FocusListener für Taschenrechner AWT, Swing, JavaFX & SWT 4
N Swing nach Fensterrand Action ausführen? HILFE AWT, Swing, JavaFX & SWT 7
R Hilfe bei Bachelorrabeit. Seitenvorschau AWT, Swing, JavaFX & SWT 7
L Mein Kopf dreht sich... Brauche Hilfe beim GUI gestalten AWT, Swing, JavaFX & SWT 10
G Swing Hilfe-Fenster erstellen AWT, Swing, JavaFX & SWT 20
E LayoutManager Hilfe ein GridbagLayout!! AWT, Swing, JavaFX & SWT 7
K GUI-Hilfe für Anfänger AWT, Swing, JavaFX & SWT 15
J Schulprojekt und braucht hilfe AWT, Swing, JavaFX & SWT 54
G Hilfe! Command Pattern an easy ImageViewer? AWT, Swing, JavaFX & SWT 13
radiac Hilfe bei GUI AWT, Swing, JavaFX & SWT 22
N Hilfe bei erstellen eines Bibliotheksprogrammes AWT, Swing, JavaFX & SWT 15
H Swing Jtable wird nicht angezeigt..hilfe!! AWT, Swing, JavaFX & SWT 16
M DRINGEND HILFE TextPane RECHTSBÜNDIG AWT, Swing, JavaFX & SWT 2
B Swing Hilfe zu JTextField AWT, Swing, JavaFX & SWT 2
J Brauche ganz dringend Hilfe!!! AWT, Swing, JavaFX & SWT 5
V Bitte um Hilfe bei nem Taschenrechner AWT, Swing, JavaFX & SWT 8
F NullPointerException - HILFE!! AWT, Swing, JavaFX & SWT 20
G Hilfe!!!Sudoku AWT, Swing, JavaFX & SWT 19
M Swing JButton hilfe AWT, Swing, JavaFX & SWT 3
M brauche Hilfe um Einträge aus Jlist zu löschen AWT, Swing, JavaFX & SWT 4
Spin Hilfe - Erklärungsbedarf für Kreis AWT, Swing, JavaFX & SWT 5
O Bitte um Hilfe bei ComboBox in TableHeader AWT, Swing, JavaFX & SWT 9
M Erstellen eines Hilfe-Fenster bzw"Erste-Schritte" AWT, Swing, JavaFX & SWT 2
G Hilfe beim Erstellen eines eigenen Html-Editors! AWT, Swing, JavaFX & SWT 4
G Hilfe Meine JPanels verschwinden im Müll AWT, Swing, JavaFX & SWT 10
G Hilfe AWT, Swing, JavaFX & SWT 8
N ausrichtung Button - hilfe bitte AWT, Swing, JavaFX & SWT 2
T Hilfe zu Events? AWT, Swing, JavaFX & SWT 6
A Ini Datei Auswerten - HILFE! AWT, Swing, JavaFX & SWT 6
D Hilfe bei GUI-Elementen in Java AWT, Swing, JavaFX & SWT 9
D Grafikeinsteiger sucht/braucht Hilfe. Wäre Nett ! AWT, Swing, JavaFX & SWT 3
K Mein Informatikprojekt läuft aus dem Ruder Hilfe. F1 ^^ AWT, Swing, JavaFX & SWT 5
S Hilfe! Bekomme Daten nicht ausgelesen AWT, Swing, JavaFX & SWT 3
M hilfe! probleme mit meinem programm AWT, Swing, JavaFX & SWT 5
V Hilfe :( bekomme textarea nicht versetzt AWT, Swing, JavaFX & SWT 2
M Hilfe ich komme nicht an ein JTextArea AWT, Swing, JavaFX & SWT 4
J Hilfe CardLayout AWT, Swing, JavaFX & SWT 3
C Hilfe bei JInternalFrame AWT, Swing, JavaFX & SWT 6
G Leider trotz allem kein Icon :( Brauche Hilfe AWT, Swing, JavaFX & SWT 3
S sinuskurve hilfe! AWT, Swing, JavaFX & SWT 2
D JSplittPane - unsichtbarer Rahmen? hilfe ;) AWT, Swing, JavaFX & SWT 2
G Selbstprogrammierter Editor - brauche Hilfe AWT, Swing, JavaFX & SWT 5
J Hilfe bei EventListening AWT, Swing, JavaFX & SWT 3
M Hilfe bei vers. Fonts und Zeilenlänge in eigenem Editor. AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben