GUI

Sasuke11222

Neues Mitglied
Hallo alle miteinander,

ich habe ein Problem mit der Projektaufgabe, welche bis Donnerstag fertig sein soll.
Und ich verzweifle schon seit 4 Tagen daran...

Hier die Aufgabe:
Entwickeln Sie jeweils eine GUI für die Ein- und Ausgabe, die die
entsprechende Schnittstelle implementiert. In der Eingabe GUI soll man Ereignisse, wenn
also ein Sensor ein Objekt erfasst, beliebig asynchron erzeugen können. An der Ausgabe GUI
soll dann immer ablesbar sein, wie das Fahrzeug reagiert. Implementieren Sie im Controller
einige erste Regeln für kollisionsfreies Fahren, so dass es im GUI sichtbar funktioniert. Achten
Sie dabei auf gute Wartbarkeit Ihres codes, später werden Sie die Regeln voraussichtlich
verändern müssen.

Meine Idee wares jetzt, dass ich in der EingabeGUI 4 Buttons habe, welche je nach Sensoreingabesignal für einen kurzen Zeitraum aufleuchten. Und in der AusgabeGUI soll dementsprechend eine kurze Textnachrricht angezeigt werden, wie das Auto sich verhält, wenn bestimmte Sensorwerte erreicht sind.

Bitte kann mir dabei jemand beim ausprogrammieren helfen? Ich bin wirklich ein totaler Anfänger was sowas angeht....
Anbei sind alle Datein die ich schon habe, um das umzusetzen.k

Vielen Dank
 

Anhänge

  • Auto-Ueb2.zip
    17,1 KB · Aufrufe: 2

kneitzel

Top Contributor
Ok, Du hast da jetzt einen ersten Anfang. Dazu evtl. schon eine erste Rückmeldung:

a) Ich weiss nicht, ob euch dies nur so gezeigt wurde, aber der Aufbau mit einer inneren Klasse für ein Event Handler und dann eine Überprüfung, von welchem Element es gerade kommt, das ist etwas, das früher mal gemacht wurde und das so nicht mehr zeitgemäß ist. Dfür gibt es ja seit Java 8 Lambda Expressions / Methodenreferenzen. Das macht dann das Lesen vom Code auch deutlich einfacher.
Java:
        DerHandler h = new DerHandler();
        button1.addActionListener(h);
        button2.addActionListener(h);
        button3.addActionListener(h);
        button4.addActionListener(h);

Wird dann zu
Java:
        button1.addActionListener( e -> button1.setBackground(Color.GREEN) );
        button2.addActionListener( e -> button2.setBackground(Color.GREEN) );
        button3.addActionListener( e -> button3.setBackground(Color.RED) );
        button4.addActionListener( e -> button4.setBackground(Color.RED) );
und die interne Klasse DerHandler entfällt komplett.
Natürlich nur, so man die Funktionalität so belässt! Hier würde es sinn machen, gezielt Methoden einzuführen, die eben hier etwas machen oder nicht machen. Dann wären da Methodenreferenzen gut:
Java:
        button1.addActionListener(this::handeFRClick);


    private void handeFRClick(ActionEvent event) {
        // ...
    }

b) Bezeichner - Wahl
Es ist bei der Wahl der Bezeichner immer wichtig, dass diese gut ausgewählt werden. Beim Entwickeln immer vor Augen behalten, was etwas ist. Deine Klasse Button ist doch kein Button. Es ist ein Fenster mit Buttons. Dann sollte es entsprechend heißen. Das zieht sich durch das ganze Projekt. Buttons heißen button1 ... button4.
Und dann die Namenkonventionen: CamelCase kennt keine _, daher wären die Klassennamen: EingabeGUI, AusgabeGUI.
Methoden fangen klein an und haben immer ein Verb mit drin:
Fenster -> fensterOeffnen
ButtonFenster -> buttonFensterOeffnen

c) Code aufräumen!
Code sollte immer aufgeräumt bleiben. Unnötige Dinge heraus löschen. Doppelte Bezeichner vermeiden!
Beispiele:
- DerHandler ist einmal ein Interface und einmal eine innere Klasse
- EventHandler ist doppelt - einmal in der inneren Klasse überschrieben und einmal in Button

Wenn die Applikation jetzt in der Klasse Button ist: Die GUI Klassen sind so ja derzeit nicht benutzt. Die würde ich so streichen. Eingabe_GUI dient ja nur dem Öffnen des Button Fensters. Das könnte man also Main nennen oder so. Ist dann natürlich auch kein JFrame.

d) Meckern auf hohem Niveau - aber ich will es dennoch ansprechen: Komposition anstelle von Vererbung: Gerade bei Oberflächen ist es oft gut, wenn man keine Vererbung einsetzt. Du erstellst ja nicht wirklich ein spezifisches JFrame. Du willst halt nur ein JFrame haben. Dazu reicht eine Instanzvariable vom Typ JFrame. Dann hast Du zwar noch keine wirkliche Trennung mit View und Controller und so, aber es geht etwas in die Richtung. Die View ist dann nur noch der Konstruktor wenn man es so sehen möchte.


Nun kommen wir noch zu dem wichtigen Punkt: Es muss ja die Kopplung stattfinden. In dem Fenster soll ja irgendwas gesteuert werden. Dazu brauchst Du einen Controller. Da ist die Frage, wie man das baut. Dazu wäre meine Idee:
Umbenennung der Klassen:
Eingabe_GUI -> Main
Button -> EingabeGUI
Ausgabe_GUI -> AusgabeGUI

EingabeGUI implementiert CarSensorInput
AusgabeGUI implementiert CarMotorOutput
Main erstellt die beiden GUI Instanzen und dann einen Controller mit den beiden. Dieser Controller wird ggf. auch benötigt in den GUI Klassen - da fehlt mir im Augenblick der Überblick, da ich mir die Aufgabe und das, was bisher so existiert nicht zu genau angesehen habe. Ich bin da noch sehr oberflächlich an den Code heran gegangen.

In den jeweiligen Methoden des Interfaces werden dann GUI Aktionen ausgeführt. AusgabeGUI kann vermutlich in der Methode einfach die Ausgabe in ein Textfeld schreiben oder so.

Wie das mit der EingabeGUI gedacht ist, habe ich noch nicht ganz verstanden. Die Buttons sollen wohl das Objekt erkennen ein/ausschalten. Du wirst also einen Zustand speichern können. Im einfachsten Fall ist das sowas wie an/aus und es wird dann ggf. einfach ein bestimmter Wert zurück gegeben. Die Methode will ja einen double Wert haben. Da ist also evtl. eine andere Oberfläche notwendig mit Eingabe von Abstandswerten, die man dann setzen kann.

Aber das wäre dann schon alles, was hier notwendig wäre um das zu bauen.
 

Jw456

Top Contributor
Hallo zu dem Thema GUI
Daz hast du eigentlich nur ein Fenster erstellt mehr nicht.
Ein Layout ist nicht zu erkennen. Deine Button vindest du nicht ein.
Auch merkwürdig ist das du zwei Main Methoden in deinem Projekt hast.
Das ganze sieht mir nur nach Kopie Past aus.

Deine gui Klasse Eingabe macht eingentlich garnichts es zeigt ein leehres Fenster an das ist aber auch alles. Deine Button besuchst du in einer anderen Klasse Fenster zuerstellen.
Deine Ausgabe Klasse hat wider eine main Methode wozu das?
 
Zuletzt bearbeitet:

Jw456

Top Contributor
Du willst in der Gui ein grid Layout benutzen ok.
Du willst alles alle Button in die Zelle 2/ 2 packen. Warum alles in eine Zelle?
Oh hier das grid Layout das richtige ist?
 

kneitzel

Top Contributor
Also das Layout ist doch erst einmal nebensächlich. Die Buttons werden angezeigt und es können die Funktionalitäten eingebaut werden.

Mit so optischen Dingen kann man sich beschäftigen, wenn man die fachliche Seite erledigt hat. Die beste und schönste GUI bringt nichts, wenn die Funktionalität nicht da ist.
 

Oben