Kleines GUI/Sortier Projekt für die Uni

nikels

Mitglied
Hallo alle zusammen,
wir als Gruppe sollen ein Projekt auf die Beine stellen das folgendes Eigenschaften aufweißt:
1) Es sollen 4 Sortieralgorithmen implementiert werden.
2) Es soll eine grafische Benutzeroberfläche geben.
3) Anhand der Zeit soll die Komplexität des Algorithmuses angezeigt.
4) Natürlich sollen per Hand Zahlen in die Zahlenfelder übernommen/übergeben werden.



Das folgende Mockup zeigt ungefähr, wie wir uns dies vorgestellt haben.
Das einzige Feature, das wir anders gestalten wollen ist, dass die Anzahl der möglichen Zahlenfelder auf Max. 8 beschränkt ist, somit gibt es schon
anfangs 8 felder und das + (für Zahlenfeld hinzufügen) und - (für Zahlenfeld entfernen) soll wegfallen.

Meine Frage ist nun hab ihr vielleicht Erfahrung in diesem Gebiet?
Wäre dankbar für Tipps und mögliche Ratschläge zur Implementierung / GUI geben.
 
Direkt als Hinweis: Bei nur 8 Zahlen wirst du keine Möglichkeit haben die Laufzeiten gescheit auszuwerten. Lass dir lieber (deutlich größere!!) Arrays mit Zufallszahlen befüllen und sortiere diese. Mögliche Schritte wären z.B. 100, 200, 400, 800, 1.600, 3.200, 6.400, 12.800. Lass diese Tests dann mehrmals (auf jeweils neuen Arrays) laufen, damit du gescheite Mittelwerte für die Laufzeit bestimmen kannst.
 
Algorithmen arbeiten soweit alle wie gewünscht die nächste Herausforderung wäre die GUI.
Da ich relativ wenig Ahnung habe hoffe ihr könnt mir Starthilfe geben.
Hier Teile des Codes und meine zusammen gebastelte GUI.
Ich habe momentan 3 Klassen 1xMain 1xSort(In der sich die Algorithmen befinden) 1xGUI

Hier erstmal Ausschnitte von Sort (Es gib mehr Algorithmen aber das sollte für Bubblesort reichen)
Java:
	int[] unorded;
	int index=0;
	int min;
	int size;


	//Array im Konstruktor erzeugen
	Sort(){
		unorded = new int[2000];
		
		for(int i=0; i<unorded.length; i++)
			unorded[i] = (int)(Math.random()*unorded.length);
	}



	//Bubblesort
	void bubblesort(){
		size = unorded.length;
		for(int y=0; y<size; size--){
			for(int x=0; x<size-1; x++){
				if(unorded[x]>unorded[x+1]){
					int puffer = unorded[x];
					unorded[x]=unorded[x+1];
					unorded[x+1]=puffer;
				}
			}
		}
	}

	//Ausgabe Methode
	void output(){
		for(int c:unorded){
			System.out.print(c+" ");
		}
	}

Hier die zusammen gebastelte GUI
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class FirstGUI extends JFrame
{
private JButton button1;
private JButton button2;
private JButton button3;
private JButton button4;
private JButton button5;
private JPanel panelButton;
private JLabel oben;
private JLabel anzeige;

public FirstGUI()
{
super("Fenster");
setLocation(300,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().setLayout(new BorderLayout(5,5));

//Buttons erzeugen
button1 = new JButton("Zufalls Array erzeugen");
button2 = new JButton("bubblesort");
button3 = new JButton("selectionsort");
button4 = new JButton("simplesort");
button5 = new JButton("ritkow");

//Panels erzeugen
panelButton = new JPanel(new GridLayout(3,1));
//Auf Panel Buttons packen
panelButton.add(button1);
panelButton.add(button2);
panelButton.add(button3);
panelButton.add(button4);

//Listener für Buttons
addButtonListener(button1);
addButtonListener(button2);
addButtonListener(button3);
addButtonListener(button4);

//Labels erzeugen
oben = new JLabel("Projekt Nirvana");

//Label zentrieren
oben.setHorizontalAlignment(JLabel.CENTER);
anzeige = new JLabel("Array Platz");

//Labels auf Frame packen
getContentPane().add(BorderLayout.NORTH, oben);
getContentPane().add(anzeige);

//Panels auf Frame packen
getContentPane().add(BorderLayout.WEST, panelButton);
pack();
setVisible(true);
}
public static void main(String[] args)
{
FirstGUI g = new FirstGUI();
}
private void addButtonListener(JButton b)
{
b.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
eingabe(ae.getActionCommand());
}
});
}
private void eingabe(String a)
{
anzeige.setText(a);
}
}

Die konkrete Frage ist wie bekomme ich das Zufalls Array und das sortierte Array (Bubblesort) als methoden in die Buttons übergeben?
Wie bekomme ich die 2000 Werte lesbar angezeigt?
 
Wie bekomme ich die 2000 Werte lesbar angezeigt?

Mit einer Textarea. Dort stehen die dann mit einem Semikolon getrennt drinnen: "203 ; 203 ; 100 ; 5 ; 76 ; ..."

Die konkrete Frage ist wie bekomme ich das Zufalls Array und das sortierte Array (Bubblesort) als methoden in die Buttons übergeben?

Java:
// GUI:
Sort sort = new Sort();
int[] sortedArray = sort.bubblesort(inputArray)

// Sort:
int[] bubblesort(int[] unsorted) {
//...
return sorted;
}
 
Das Projekt ist in 1,5 Wochen fällig und es passt eigentlich so weit alles.
Es fehlen noch bei 2 fenstern die Scollbuttons die ich nicht hin bekomme.


Anfang der Main
Java:
public class MainWindow extends JFrame {
		
	private static final long serialVersionUID = 1L;
	long vorher;
	private JPanel contentPane;
		
	public static void main() {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					MainWindow frame = new MainWindow();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	
	}
	public MainWindow() {
		getContentPane().setLayout(null);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 600);
		
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);

Rückgabe Fenster wobei die Scrollbuttons bei txtpnVorher und txtpnResult benötigt werden.
Java:
		//Rueckgabefelder
		
		
		final JTextPane txtpnVorher= new JTextPane();
		txtpnVorher.setBounds(25, 40, 350, 150);
		contentPane.add(txtpnVorher);
		
		final JTextPane txtpnResult= new JTextPane();
		txtpnResult.setBounds(25, 375, 150,100);
		contentPane.add(txtpnResult);
		
		final JTextPane txtpnTime = new JTextPane();
		txtpnTime.setBounds(225, 375, 175, 20);
		contentPane.add(txtpnTime);

Action Listener für Zufallsarray und 1 der SortAlgos
Java:
		//Action Listener
		btnAdd.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				
				int[] all = null;
								
				try {
				    
					Sort e1 = new Sort();
					e1.randomArray();
					
					all = Sort.getResult();

					Arrays.toString(all);
				    System.out.println(Arrays.toString(all));
	
				} catch (Exception e1) {
					JOptionPane.showMessageDialog(null,
							"Please check your data\n" + e1.getMessage());
				}
				  txtpnVorher.setText("Ergebnis: "+ Arrays.toString(all) );	
			}
		});
		
		
		btnBubblesort.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				
				int[] all = null;
								
				try {
				    
					
					Sort a = new Sort();
					vorher = System.currentTimeMillis();
					a.bubblesort();
					
					
					all = Sort.getResult();

					Arrays.toString(all);
				    System.out.println(Arrays.toString(all));
					
				    vorher = System.currentTimeMillis() - vorher;
				} catch (Exception e1) {
					JOptionPane.showMessageDialog(null,
							"Erstellen Sie zuerst ein Zufallsarray. Ihr aktuelles Array hat\n" + e1.getMessage()+" Zahlen");
				}
				
				 txtpnResult.setText("Ergebnis: "+ Arrays.toString(all) );
				txtpnTime.setText("Zeit ms: "+vorher);
			
				
			}
		});
Außer dem Scrollbuttons läuft soweit alles wie gewünscht, deswegen hoffe ich jemand kann mir sagen
wie ich das "Scollbutton" Problem einfach lösen kann.
Ich würde am liebsten falls möglich nur die JTextPanes erweitern, da ich den GUI-Kurs erst übernächstes Semester habe und ungern wieder sachen umbauen möchte (wegen fehlenden Know-how).
 
Mit ScrollButtons meinst du was......? Scrollbalken, Vertikal sowie Horizontal ?

Falls ja dann ist die JScrollPane die Qual der Wahl.
 
Ja habs schon mit JScrollPane versucht aber hab nichts zustande bekommen. :noe:
Ein JScollPane zu erstellen ist kein Problem aber es an den richtigen platz zu setzten und es mit der Methode zu verbinden klappt bei mir nicht.
 
Ein JScollPane zu erstellen ist kein Problem aber es an den richtigen platz zu setzten und es mit der Methode zu verbinden klappt bei mir nicht.

Du übergibst eine JScrollPane einfach die zu Scrollende Komponenten, z.B eine JTextArea

hauptsache ist das die Komponente das Interface Scrollable implementiert.

Java:
JTextArea area = new JTextArea();

JScrollPane pane = new JScrollPane(area);

sollte der Text nun länger sein als in der TextArea dargestellt werden kann, wird die Scrollpane den sogenannten ViewPort der TextArea durch ScrollBalken erweitern.

platzieren kannst du das ganze wie jedes andere Element in Swing über die verschiedenen Layoutmanager welche du den einzelnen JPanel zuordnest, die wiederum die Komponenten enthalten.

einer JTextArea kannst du Text entweder per
Code:
.append();
oder ganz normal über deren
Code:
.setText();
Methode übergeben.
 
Zuletzt bearbeitet:
Wenn ich z.B. das Feld des Unsortierentarrays ändere von
Java:
		final JTextPane txtpnVorher= new JTextPane();
		txtpnVorher.setBounds(25, 40, 350, 150);
		contentPane.add(txtpnVorher);

zu

Java:
		final JTextArea area = new JTextArea();
		JScrollPane pane = new JScrollPane (area);
		area.setBounds(25, 40, 350, 150);
		contentPane.add(area);

dann kann ich immer noch nicht Scrollen.
Hab ich irgendwas vergessen ?

OK es klappt wobei alle Zahlen jetzt ohne Zeilenumbruch da stehen (Alle Zahlen in 1 Reihe)
Bekomme ich es irgend wie einfach hin da einen Zeilenumbruch zu realisieren ?
 
Zuletzt bearbeitet:
Zeilenumbruch klappt auch jetzt möchte ich nur noch das es oben beginnt (Scrollbutton oben),
da momentan die letzten Elemente angezeigt werden.
Java:
area.setCaretPosition(0);
funktioniert leider nicht :noe:
 

Neue Themen


Zurück
Oben