Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)
Paste
Pasted as text by cdc ( 18 years ago )
import java.util.Random;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Spinner;
public class GUI implements Runnable {
// Variablen für Fenstergrösse, Gruppen und Buttongrösse festlegen
private int windowSizeX = 800;
private int windowSizeY = 600;
private int windowMinSizeX = 600;
private int windowMinSizeY = 565;
private int buttonSizeY = 28;
private int labelSizeY = 25;
private int radioGroupSizeY = 27;
private Shell shell;
private Display display;
private Drawer currentDrawer;
private Group messGroup;
private Canvas dc;
// zum Messen der Zeit:
private Clock uhr;
// unsere Sortierklasse, enthaelt die Sortierfunktionen:
private Sort sort;
// das Array, auf dem wir sortieren:
private int[] values;
private Button startSort;
private Button messen;
private Button zeichnen;
private Label bubbleErgebnis;
private Label selectionErgebnis;
private Label insertionErgebnis;
private Label mergeErgebnis;
private Label heapErgebnis;
private Label quickErgebnis;
private Spinner spinner;
private Combo vorsortierung;
private Combo sortCombo;
private Combo diagCombo;
private GraphDrawer gDrawer;
private BarDrawer bDrawer;
private GridData dcLayout;
/*****************************************************
* Bedienelemente erstellen (NO Click/Change-Handling)
* Position: BEGINN
*/
// GUI starten
public GUI() {
sort = new Sort(this);
uhr = new Clock();
display = new Display();
shell = new Shell(display);
shell.setSize(windowSizeX, windowSizeY);
shell.setText("Sortieralgorithmen");
shell.setMinimumSize(windowMinSizeX,windowMinSizeY);
//Groesse des Bedienfeldes
int gridSizeX = (int)(shell.getSize().x/5);
int gridSizeY = (int)(shell.getSize().y*0.9);
// Das Hauptlayout erstellen
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 2;
shell.setLayout(gridLayout);
// Die Zeichenflaeche erstellen
dcLayout = new GridData();
dcLayout.grabExcessHorizontalSpace = true;
dcLayout.grabExcessVerticalSpace = true;
dcLayout.horizontalAlignment = SWT.FILL;
dcLayout.verticalAlignment = SWT.FILL;
dc = new Canvas(shell, SWT.NONE);
dc.setBackground(new Color(display, 255, 255, 255));
// Die beiden Drawer erstellen
gDrawer = new GraphDrawer(dc);
bDrawer = new BarDrawer(dc);
// Momentanen Drawer festlegen
currentDrawer = gDrawer;
// Auf Zeichnung warten
dc.addPaintListener(gDrawer);
dc.setLayoutData(dcLayout);
// Das Bedienfeld auf der rechten Seite
GridData controlLayout = new GridData(gridSizeX, gridSizeY);
Composite control = new Composite(shell, SWT.BORDER);
control.setLayoutData(controlLayout);
RowLayout cLayout = new RowLayout();
cLayout.type = SWT.VERTICAL;
control.setLayout(cLayout);
// Label: Arraygroesse
Label sizeLabel = new Label(control, SWT.NONE);
sizeLabel.setText("Arraygroesse:");
// Spinner: Rollfeld für Arraygrössenauswahl
spinner = new Spinner(control, SWT.BORDER);
spinner.setMinimum(1);
spinner.setMaximum(41000000);
spinner.setSelection(1000);
spinner.setIncrement(1);
spinner.setPageIncrement(100);
// Label: Vorsortierung
Label vorLabel = new Label(control, SWT.None);
vorLabel.setText("Vorsortierung:");
// DropDown-Menü: Vorsortierung
vorsortierung = new Combo(control, SWT.READ_ONLY);
vorsortierung.setItems(new String[] { "zufaellig", "sortiert",
"umgekehrt sortiert", "gauss'sche Kurve" });
vorsortierung.select(0);
vorsortierung.setLayoutData(new RowData((int)(gridSizeX-10), labelSizeY));
// Label: Sortierverfahren
Label sortLabel = new Label(control, SWT.NONE);
sortLabel.setText("Sortierverfahren:");
// DropDown-Menü: Sortierverfahren
sortCombo = new Combo(control, SWT.READ_ONLY);
sortCombo.setItems(new String[] { "BubbleSort", "SelectionSort",
"InsertionSort", "MergeSort" , "QuickSort"});
sortCombo.select(0);
sortCombo.setLayoutData(new RowData((int)(gridSizeX-10), buttonSizeY));
// Radio-Buttons: zeichnen / messen
Group radioGroup = new Group(control, SWT.None);
GridLayout radioLayout = new GridLayout();
radioLayout.numColumns = 1;
radioGroup.setLayout(radioLayout);
radioGroup.setLayoutData(new RowData((int)(gridSizeX-15), (2*radioGroupSizeY)));
// Zeichnen-RadioButton
zeichnen = new Button(radioGroup, SWT.RADIO);
zeichnen.setText("zeichnen");
zeichnen.setSelection(true);
// Messen-RadioButton
messen = new Button(radioGroup, SWT.RADIO);
messen.setText("messen");
// Label: Darstellung
Label diagLabel = new Label(control, SWT.NONE);
diagLabel.setText("Darstellung:");
// DropDown-Menü: Darstellung
diagCombo = new Combo(control, SWT.READ_ONLY);
diagCombo.setItems(new String[] { "Punkte", "Balkendiagramm" });
diagCombo.select(0);
diagCombo.setLayoutData(new RowData((int)(gridSizeX-10), buttonSizeY));
// Layout für die Buttons setzen
RowLayout groupLayout = new RowLayout();
Composite buttonGroup = new Composite(control, SWT.NONE);
groupLayout.type = SWT.VERTICAL;
buttonGroup.setLayout(groupLayout);
// Button: Neues Array
Button createArray = new Button(buttonGroup, SWT.PUSH);
createArray.setText("Neues Array");
createArray.setLayoutData(new RowData((int)(gridSizeX-15), buttonSizeY));
// Button: Starte
startSort = new Button(buttonGroup, SWT.PUSH);
startSort.setText("Starte " + sortCombo.getText());
startSort.setLayoutData(new RowData((int)(gridSizeX-15), buttonSizeY));
// Gruppe: Messergebnisse
messGroup = new Group(control, SWT.BORDER);
RowLayout messLayout = new RowLayout();
messLayout.type = SWT.VERTICAL;
messGroup.setLayout(messLayout);
messGroup.setText("Messergebnisse:");
messGroup.setVisible(false);
// Die jeweiligen Ergebnisse der einzelnen Messmethoden auf der Messergebnisse-Gruppe
bubbleErgebnis = new Label(messGroup, SWT.None);
bubbleErgebnis.setLayoutData(new RowData((int)(gridSizeX-20), buttonSizeY));
selectionErgebnis = new Label(messGroup, SWT.None);
selectionErgebnis.setLayoutData(new RowData((int)(gridSizeX-20), buttonSizeY));
insertionErgebnis = new Label(messGroup, SWT.None);
insertionErgebnis.setLayoutData(new RowData((int)(gridSizeX-20), buttonSizeY));
mergeErgebnis = new Label(messGroup, SWT.None);
mergeErgebnis.setLayoutData(new RowData((int)(gridSizeX-20), buttonSizeY));
heapErgebnis = new Label(messGroup, SWT.None);
heapErgebnis.setLayoutData(new RowData((int)(gridSizeX-20), buttonSizeY));
quickErgebnis = new Label(messGroup, SWT.None);
quickErgebnis.setLayoutData(new RowData((int)(gridSizeX-20), buttonSizeY));
// unsichtbare Buttons definieren, um den Abstand des Beenden Buttons hinzubekommen (nerdi, ich weiss ;D)
Button b = new Button(buttonGroup,SWT.PUSH);
Button b2= new Button(buttonGroup,SWT.PUSH);
Button b3= new Button(buttonGroup,SWT.PUSH);
Button b4= new Button(buttonGroup,SWT.PUSH);
Button b5= new Button(buttonGroup,SWT.PUSH);
b.setVisible(false);
b2.setVisible(false);
b3.setVisible(false);
b4.setVisible(false);
b5.setVisible(false);
// Button: Beenden
Button endProgram = new Button(buttonGroup, SWT.PUSH);
endProgram.setText("Beenden");
/*****************************************************
* Bedienelemente erstellen (NO Click/Change-Handling)
* Position: ENDE
*/
/*****************************************************
* Click/Change-Handling der Bedienelemente erstellen
* Position: BEGINN
*/
// Waehlt Messmethode (Zeichnen oder Messen) aus
messen.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(SelectionEvent e)
{
if (diagCombo.isEnabled())
{
diagCombo.setEnabled(false);
dc.setVisible(false);
messGroup.setVisible(true);
}
else
{
diagCombo.setEnabled(true);
dc.setVisible(true);
messGroup.setVisible(false);
}
}
});
// Waehlt Darstellung (Graph oder Bar) aus
diagCombo.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
switch (diagCombo.getSelectionIndex()) {
case 0:
dc.removePaintListener(bDrawer);
dc.addPaintListener(gDrawer);
dc.setLayoutData(dcLayout);
currentDrawer = gDrawer;
break;
case 1:
dc.removePaintListener(gDrawer);
dc.addPaintListener(bDrawer);
dc.setLayoutData(dcLayout);
currentDrawer = bDrawer;
break;
}
}
});
// Erstellt neues Array je nach Auswahl in der Vorsortierungs-DropDown-Box
createArray.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
switch (vorsortierung.getSelectionIndex()) {
case 0:
newRandomArray();
break;
case 1:
newSortedArray();
break;
case 2:
newReverseArray();
break;
case 3:
newGaussArray();
break;
}
update(values);
}
});
// Führt ausgewaehltes Sortierverfahren aus
startSort.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
switch (sortCombo.getSelectionIndex()) {
case 0: {
// messe Zeit...
sort.bubbleSort(values);
if (messen.getSelection()) {
// bubbleErgebnis.setText("Zeit fuer "
// + sortCombo.getText() + ": " + zeit + "ms");
}
}
break;
case 1: {
// messe Zeit...
sort.selectionSort(values);
if (messen.getSelection()) {
// bubbleErgebnis.setText("Zeit fuer "
// + sortCombo.getText() + ": " + zeit + "ms");
}
}
break;
case 2: {
// messe Zeit...
sort.insertionSort(values);
if (messen.getSelection()) {
// bubbleErgebnis.setText("Zeit fuer "
// + sortCombo.getText() + ": " + zeit + "ms");
}
}
break;
case 3: {
// messe Zeit...
sort.mergeSort(values);
if (messen.getSelection()) {
// bubbleErgebnis.setText("Zeit fuer "
// + sortCombo.getText() + ": " + zeit + "ms");
}
}
break;
}
}
});
// Setzt den Text für den Starten-Button dynamisch nach dem ausgewaehlten Sortierverfahren aus
sortCombo.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
startSort.setText("Starte " + sortCombo.getText());
}
});
// Beende das Programm, wenn der Beenden-Button gedrueckt wurde
endProgram.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
System.exit(0);
}
});
/*****************************************************
* Click/Change-Handling der Bedienelemente erstellen
* Position: ENDE
*/
}
private void newRandomArray() {
int size = spinner.getSelection();
values = new int[size];
Random random = new Random();
for (int i = 0; i < size; i++) {
values[i] = random.nextInt(size) + 1;
// values[i] = size - i;
}
}
private void newSortedArray() {
int size = spinner.getSelection();
values = new int[size];
for (int i = 0; i < size; i++) {
values[i] = i + 1;
}
}
private void newReverseArray() {
int size = spinner.getSelection();
values = new int[size];
for (int i = 0; i < size; i++) {
values[i] = size - i + 1;
}
}
private void newGaussArray() {
int size = spinner.getSelection();
values = new int[size];
double[] gausarray = new double[size];
Random random = new Random();
for (int i = 0; i < size; i++) {
gausarray[i] = random.nextGaussian();
}
double min = gausarray[0];
for (int i = 0; i < size; i++) {
if (min > gausarray[i]) {
min = gausarray[i];
}
}
for (int i = 0; i < size; i++) {
gausarray[i] -= min;
}
double max = gausarray[0];
for (int i = 0; i < size; i++) {
if (max < gausarray[i]) {
max = gausarray[i];
}
}
for (int i = 0; i < size; i++) {
values[i] = (int) Math.round(gausarray[i] * (size / max));
}
}
public void run() {
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
public void update(int[] values) {
if (zeichnen.getSelection()) {
currentDrawer.setArray(values);
dc.update();dc.redraw();
}
}
public void updateNoScale(int[] values) {
if (zeichnen.getSelection()) {
currentDrawer.setArray(values);
currentDrawer.setScale(false);
dc.update();dc.redraw();
currentDrawer.setScale(true);
}
}
}
Revise this Paste