Erste Schritte in Java GUI

  • Themenstarter Gelöschtes Mitglied 32912
  • Beginndatum
G

Gelöschtes Mitglied 32912

Gast
Hallo Com,

ich soll einen Vortrag mit dem Thema "Einführung in die GUI-Prorammierung", es soll zwar nur eine kleine Einführung sein, aber mich interessiert es auch persönlich.

Ich habe einfach mal ein Programm genommen, welches wir schon mal in der Schule nur für die Konsole geschrieben hatte. Darauf wollte ich jetzt eine GUI setzen. Ich habe das soweit auch hinbekommen, aber hatte alles in einer Klasse. Sodass es viel und langer Code war und es ist ja auch kein sauberer Programmierstil.
Deshalb möchte ich das MVC-Modell (Model, View, Control) schon anwenden. Dort habe ich dann in der Model-Klasse die Daten und Funktionen zu Verarbeitung, die Control-Klasse welche die Aktionen der Button, Textfelder usw. steuert und die View-Klasse welche die Oberfläche baut.

1. Problem
Ich steh gerade vor dem Problem, dass ich nicht weiß wie ich die Daten aus der Model-Klasse über die Control-Klasse an die View-Klasse übergeben kann. Das mit den Button funktioniert schon. Aber ich möchte das Ergebnis einer Funktion aus der Model-Klasse an die View-Klasse dann zurückgeben, sodass es da in einem Textfeld dargestellt wird.
Ich habe mir das mit dem Observer schon angeguckt, aber vllt kann man das erst mal ohne lösen?

2.Problem
Ich möchte Checkboxen einbauen, aber irgendwie versteh ich nicht wie das geht. Ich vermute, dass es daran liegt, dass ich bei Problem 1 schon nicht weiterkomme. Ich würde mich freuen, wenn mir jmd erklärt.


Nachfolgend sind meine Klassen EMail-Main, Email-Control, Email-Model und Email-View.
Wenn da schon etwas schlecht ist, bitte mitteilen und Tipp/Stichwort zur Verbesserung.


Viel unübersichtlicher Code, aber vllt blickt das ja jmd.
 

Anhänge

  • EmailMain.java
    405 Bytes · Aufrufe: 6
  • EmailController.java
    1,4 KB · Aufrufe: 7
  • EmailModel.java
    1,4 KB · Aufrufe: 6
  • EmailView.java
    5,1 KB · Aufrufe: 6

M_Schaffrath

Aktives Mitglied
1. Problem
Ich steh gerade vor dem Problem, dass ich nicht weiß wie ich die Daten aus der Model-Klasse über die Control-Klasse an die View-Klasse übergeben kann. Das mit den Button funktioniert schon. Aber ich möchte das Ergebnis einer Funktion aus der Model-Klasse an die View-Klasse dann zurückgeben, sodass es da in einem Textfeld dargestellt wird.
Ich habe mir das mit dem Observer schon angeguckt, aber vllt kann man das erst mal ohne lösen?

Das Beobachter-Modell soll ja gerade das Problem lösen, dass das Modell Änderungen seines Zustandes an all seine Benutzer weitergeben muss, ohne zu wissen, wer oder was diese sind.

Stell dir vor, das Modell würde eine Uhr darstellen. Die Uhr läuft und ändert damit regelmäßig ihren Zustand, ohne dass das von außen irgendwie beeinflusst werden müsste oder dass jemand davon weiß. Umgekehrt kann die Uhr von vielen verschiedenen Dingen benutzt werden - ein Bahnhofsuhr soll die Zeit anzeigen, ein Wecker zu einer bestimmten Zeit loslärmen, eine Straßenlaterne soll sich zu bestimmten Zeiten an- oder abschalten und eine Bombe soll ein einziges Mal im richtigen Moment explodieren.

MVC sieht vor, dass das Modell keine Ahnung hat, wer es benutzt. Ansonsten müsste z.B. die Uhr beigebracht bekommen, wie ein Wecker oder eine Straßenlaterne funktioniert und jedesmal, wenn jemand eine neue Art findet, eine Uhr zu benutzen, müsste er das der Uhr beibringen.

Dafür bieten Modell ein Format an, in dem sie Beobachter akzeptieren. Jeder Anwender baut sich so einen mit dem Modell kompatiblen Beobachter und übergibt ihn dem Modell. Das Modell teilt all seine Änderungen all seinen Beobachtern mit.

Pseudocode:
Java:
// Modell für eine Uhr
class ClockModel{
   private ArrayList<ClockListener> listeners = new ArrayList<>(); // Liste aller dem Modell bekannten Beobachter
   private int time; // Zeit

   public addClockListener(ClockListener listener){
      this.listeners.add(listener); // übergib dem Modell einen Beobachter
   }

   private void tictoc(){
      this.time++; // Zeit läuft weiter
      for(ClockListener x : this.listeners)
         x.actionPerformed(new ClockEvent(this.time)); // unterrrichte Listener von der Änderung
   }
}

// Format für Uhrbeobachter
interface ClockListener{
   public void actionPerformed(ClockEvent ce);
}

// "Darstellung" der Uhr als Wecker
class AlarmClock{
   private int wakingTime; // Weckzeit

   private void ring(){
      // Wecker klingelt
   }

   public AlarmClock(ClockModel model){ // Wenn ein Wecker erschaffen wird, bekommt er ein Modell
      model.addClockListener(new ClockListener(){ // der Wecker gibt dem Modell einen Beobachter
         public void actionPerformed(ClockEvent ce){
            if(ce.getTime() == wakingTime) // wenn die Uhr die Weckzeit erreicht hat, klingelt der Wecker
               ring();
         }
      });
   }
}

// "Darstellung" der Uhr als Standuhr
class GrandfatherClock{

   private void moveHands(){
      // Uhrzeiger wird bewegt
   }

   public GrandfatherClock(ClockModel model){ // Wenn eine Standuhr erschaffen wird, bekommt sie ein Modell
      model.addClockListener(new ClockListener(){ // die Standuhr gibt dem Modell einen Beobachter
         public void actionPerformed(ClockEvent ce){
            moveHands(); // jedesmal, wenn die Uhr tickt, bewegt die Standuhr den Zeiger
         }
      });
   }
}

Ich hoffe, es wird klar, wie das Prinzip funktioniert und warum das Modell nicht wissen muss, auf welche Art seine Zustandsänderungen verwendet werden.

In der freien Wildbahn ist MVC auch selten einfach und sauber getrennt, gerade wie man den "Controller"-Aspekt umsetzt, ist nicht immer ganz eindeutig. MVC bedeutet auch nicht, dass man die einzelnen Komponenten in Dateien oder Klassen trennen muss, das Designprinzip hat mit den Strukturen der Sprache Java nichts zu tun.
Außerdem sollte man wissen, dass z.B. die Elemente in Java Swing eine Geschmacksrichtung von MVC bereits von selbst implementieren, da z.B. ein dummer JButton, den man mit
Code:
frame.add(new JButton("Test")
gebaut hat, schon über ein Modell verfügt (in dem z.B. das Textlabel des Buttons gespeichert ist) und auch über Darstellungs- und Controller-Elemente: Selbst wenn der Button noch nichts "tut" wird er schon dargestellt und ist beim Klicken animiert. Swing-Komponenten allein als reine Elemente der Darstellungsebene zu sehen, stimmt also nicht ganz.

Wenn es dir vor allem darum geht, das MVC-Prinzip zu verstehen, rate ich dir, das erst einmal mit einfachen Beispielen zu tun, bevor du dich mit allzuviel Java-Code verzettelst, der mit dem Thema direkt nichts zu tun hat. Wichtig an einem Beispiel fände ich, zu zeigen, dass und wie einzelne Komponenten austauschbar sind und die einzelnen Teile zu identifizieren.
Hier wird das Prinzip mit allen Tücken und ohne Java ziemlich gut erklärt.
 
Zuletzt bearbeitet:
G

Gelöschtes Mitglied 32912

Gast
Gut danke für die viele Hilfe,
dann werde ich also nochmal von vorne Anfangen.

Ich werde wohl erst mal einfach anfangen für den Vortrag die GUI etwas abstrakt erstellen und dann nach und nach mich in MVC einarbeiten, damit ich verstehe wie der Aufbau bzw. worin der Sinn dahinter ist und wie es dann angewendet wird. Da MVC ein größere Einarbeitungszeit zu benötigen scheint.
 

M_Schaffrath

Aktives Mitglied
Geht es denn eher allgemein um Gestaltungsmuster und Architekturen von grafischen Oberflächen oder darum, nach welchen Prinzipien z.B. das Java-Swing-Framework funktioniert oder darum, dass am Ende jeder ein Fenster mit einem Button programmieren kann, der beim Klicken die Meldung "Hello World" ausgibt?

Denn GUIs sind ein Riesenthema, mit dem man ganz problemlos Vorlesungsreihen und Bücherregale füllen kann und wenn es nur um einen Kurzvortrag geht, solltest du weder ein Riesenfass aufmachen und alle Aspekte und Buzzwords aus dem Bereich ansprechen, noch dich in Details verstricken.
 
G

Gelöschtes Mitglied 32912

Gast
Es geht erst mal darum, dass jeder danach jmd etwas ins Textfeld eingeben kann und wenn man auf einen Button drückt passiert.

Das ist erst mal das Ziel.


Das Thema oben ist mehr um meinen Horizont zu erweitern. Da es mich persönlich auch interessiert.
 

Neue Themen


Oben