Java-Pattern Tutorial

Kapitel
Grundlagen Beispielcode UML-Darstellung Übung
Home

Einführung

GUI programmieren

Patterns

   MVC

Verzeichnisse

Beispiel zu MVC-Pattern

Bevor sie dieses Beispiel bearbeiten können müssen sie die Datenbank-Datei einbinden. Die Datei "MVCBeispiel.mdb" liegt den Beispielen bei.

Anleitung

Vor dem ersten Programmstart muss für die Datenbank "MVCBeispiel.mdb" ein ODBC-Eintrag mit dem Datenquellen-Namen "mvcBeispiel" erstellt werden.

Einrichten der Datenquelle mit DSN "mvcBeispiel":

Systemsteuerung -> Verwaltung -> ODBC-Datenquellen -> unter "Benutzer-DSN" -> Hinzufügen -> Microsoft Access Treiber wählen -> Fertigstellen -> als "Datenquellenname" "mvcBeispiel" eintragen  -> Datenbank / Auswählen klicken -> im erscheinenden File-Chooser zum Verzeichnis navigieren, in dem sich "MVCBeispiel.mdb" befindet -> markieren -> OK -> OK -> OK.

Vergewissern Sie sich vor dem Testen der Anwendung über vorhandene Kunden, indem Sie die MVCBeispiel-DB direkt öffnen!

Hier eine Liste mit den zugehörigen Daten

Name PLZ Ort Kontostand
Mueller 71732 Tamm 100.0
Meier 78120 Furtwangen -50.0
Schneider 66185 Heidelberg -100.0

Screenshot

Abb. 3.3: Screenshot Eingabemaske

Quelltexte

Das gesamte Programm erstreckt sich über vier Dateien.

Hauptprogramm

public class C_Funktionsauswahl {

 public static void main(String[] args) {

  C_UpdateKunde c = new C_UpdateKunde();

  c.starten();

 }
}

Tab. 3.1: Datei C_Funktionsauswahl.java

Die Datei C_Funktionsauswahl.java enthält die Hauptanwendung. Deren Aufgabe ist es lediglich den Controller zu initialisieren und zu starten.

Controller

import java.awt.event.*; //1.

public class C_UpdateKunde implements WindowListener, MouseListener {

 private UI_Kunde w; //View

 private Kunde m; //Model


 // Konstruktor
 public C_UpdateKunde() {
 }

 public UI_Kunde getUI_Kunde() {
  return w;
 }

 public void setUI_Kunde(UI_Kunde uI_Kunde) {
  this.w = uI_Kunde;
 }

 public Kunde getKunde() {
  return m;
 }

 public void setKunde(Kunde kunde) {
  this.m = kunde;
 }

 void starten() {

  // Zuerst erstellen...
  w = new UI_Kunde();
  m = new Kunde();

  // ... dann befuellen
  w.setC_UpdateKunde(this);
  w.setKunde(m);

  // View/GUI starten
  w.starten();
 }

 void abschliessen() {
 }

 // Alle Methoden des Interface WindowListener 2.
 public void windowClosing(WindowEvent we) {

  System.exit(0);
 }

 
public void windowOpened(WindowEvent we) {}
 public void windowActivated(WindowEvent we) {}
 public void windowClosed(WindowEvent we) {}
 public void windowDeactivated(WindowEvent we) {}
 public void windowDeiconified(WindowEvent we) {}
 public void windowIconified(WindowEvent we) {}

 // Alle Methoden des Interface MouseListener
 public void mouseClicked(MouseEvent me) {

  Object o = me.getSource();

  if (o.equals(w.btnAnzeige)) { // wenn Kunde anzeigen geklickt

   m.erstelleKunde(w.txtEingabeKunde.getText());
   w.kundeAnzeigen();
  }
  else { // wenn Button "Bonitaet anzeigen" geklickt

   m.hatBonitaet(new 
        Double(w.txtEingabeBonitaet.getText()).doubleValue());
   w.bonitaetAnzeigen();
  }
 }

 
public void mouseReleased(MouseEvent me) {}
 public void mousePressed(MouseEvent me) {}
 public void mouseEntered(MouseEvent me) {}
 public void mouseExited(MouseEvent me) {}
}

Tab. 3.2: Datei C_UpdateKunde.java --> Controller

Die Datei C_UpdateKunde.java ist für die Ereignisbehandlung und Delegation zuständig.

Ereignisbehandlung

  1. Interfaces MouseListener und WindowListener implementieren.
  2. Interfacemethoden gegebenenfalls ausprogrammieren.

Ereignisdelegation

  1. Partner kennen
  2. Methode starten(): Partner initialisieren und starten.

View

import java.awt.*;

public class UI_Kunde extends Frame {

 private C_UpdateKunde c;

 private Kunde m;


 // Fensterkomponenten
 Label lblEingabeKunde, lblEingabeBonitaet, lblAusgabeKunde,  
       lblAusgabeBonitaet;
 TextField txtEingabeKunde, txtEingabeBonitaet, txtAusgabeBonitaet;
 TextArea taAusgabeKunde;
 Button btnAnzeige, btnBonitaet;

 public UI_Kunde() {

  //GUI
  // Fenster
  super("MVC Beispiel: Bonitaet pruefen");
  this.setLocation(200,200);
  this.setSize(300, 340);
  this.setBackground(Color.lightGray);
  this.setLayout(null);

  // Label lblEingabeKunde
  lblEingabeKunde = new Label("Bitte Kunde eingeben:");
  lblEingabeKunde.setLocation(20,30);
  lblEingabeKunde.setSize(250,30);
  this.add(lblEingabeKunde);

  // Textfield txtEingabeKunde
  txtEingabeKunde = new TextField();
  txtEingabeKunde.setLocation(20,60);
  txtEingabeKunde.setSize(250, 20);
  this.add(txtEingabeKunde);

  // Label lblEingabeBonitaet
  lblEingabeBonitaet = new Label("Bitte Warenwert eingeben:");
  lblEingabeBonitaet.setLocation(20,80);
  lblEingabeBonitaet.setSize(250,30);
  this.add(lblEingabeBonitaet);

  // Textfield txtEingabeBonitaet
  txtEingabeBonitaet = new TextField();
  txtEingabeBonitaet.setLocation(20,110);
  txtEingabeBonitaet.setSize(250, 20);
  this.add(txtEingabeBonitaet);

  // Button btnAnzeigen
  btnAnzeige = new Button("Kunde anzeigen!");
  btnAnzeige.setLocation(20,140);
  btnAnzeige.setSize(100,30);
  this.add(btnAnzeige);

  // Button btnBonitaet
  btnBonitaet = new Button("Bonitaet prüfen!");
  btnBonitaet.setLocation(170,140);
  btnBonitaet.setSize(100,30);
  this.add(btnBonitaet);

  // Label lblAusgabeKunde
  lblAusgabeKunde = new Label("Kunde:");
  lblAusgabeKunde.setLocation(20,180);
  lblAusgabeKunde.setSize(150,30);
  this.add(lblAusgabeKunde);

  // Label lblAusgabeBonitaet
  lblAusgabeBonitaet = new Label("Bonitaet:");
  lblAusgabeBonitaet.setLocation(180,180);
  lblAusgabeBonitaet.setSize(100,30);
  this.add(lblAusgabeBonitaet);

  // TextArea taAusgabeKunde
  taAusgabeKunde = new TextArea();
  taAusgabeKunde.setLocation(20,210);
  taAusgabeKunde.setSize(150, 90);
  this.add(taAusgabeKunde);

  // Textfield txtAusgabeBonitaet
  txtAusgabeBonitaet = new TextField();
  txtAusgabeBonitaet.setLocation(180,210);
  txtAusgabeBonitaet.setSize(100, 20);
  this.add(txtAusgabeBonitaet);
 }

 public C_UpdateKunde getC_UpdateKunde() {
  return c;
 }

 public void setC_UpdateKunde(C_UpdateKunde c_UpdateKunde) {
  this.c = c_UpdateKunde;
 }

 public Kunde getKunde() {
  return m;
 }

 public void setKunde(Kunde kunde) {
  this.m = kunde;
 }

 void starten() {

  // Listener in GUI einfuegen - von Fenstererstellung getrennt
  btnAnzeige.addMouseListener(c);
  btnBonitaet.addMouseListener(c);
  this.addWindowListener(c);

  this.setVisible(true);
  txtEingabeKunde.requestFocus();
 }

 public void kundeAnzeigen() {

  // TextArea und Textfelder leeren
  txtEingabeBonitaet.setText("");
  taAusgabeKunde.setText("");
  txtAusgabeBonitaet.setText("");
  String ausgabe = "Name: " + m.getName() + "\n" + "PLZ: " + 
                    m.getPlz() + "\n" + "Ort: " + m.getOrt() + "\n" +
                    "Kontostand: " + m.getKontostand();

  taAusgabeKunde.setText(ausgabe); 
  txtEingabeBonitaet.requestFocus();
 }

 public void bonitaetAnzeigen() {

  txtAusgabeBonitaet.setText("");

  if (m.getBonitaet() == true) {

   txtAusgabeBonitaet.setText("Ja");
  }
  else {

   txtAusgabeBonitaet.setText("Nein");
  }
 }

 boolean pruefen() {
  return false;
 }
}

Tab. 3.3: Datei UI_Kunde.java --> View

Der View enthält die grafische Benutzeroberfläche. Die wird im Konstruktor aufgebaut.

Der View muss ebenfalls beide Partner kennen. Diese Aufgabe übernehmen die beiden Methoden setKunde(Kunde) und setC_UpdateKunde(C_UpdateKunde). Diesen Methoden werden vom Controller aufgerufen.

Außerdem stellt der View noch Methoden zur Anzeige von bestimmten Daten, die durch Ereignisse hervorgerufen werden. Da der View jedoch für keine Ereignisse zuständig ist, stellt er Methoden für den Controller zur Verfügung, die eine Änderung der grafischen Benutzeroberfläche anstoßen.

Diese Methoden heißen kundeAnzeigen() und bonitaetAnzeigen(). Werden diese Methoden vom Controller aufgerufen, so holt sich der View die Daten vom Model und zeigt diese an.

Model

import java.sql.*;
import java.util.Collection;

public class Kunde {

 private static final String url ="jdbc:odbc:mvcBeispiel";
 private static final String DBDriver =  
                                  "sun.jdbc.odbc.JdbcOdbcDriver";


 private String name;

 private String plz = "";

 private String ort = "";

 private double kontostand = 0.0;

 private boolean bonitaet = false;

 private Collection uI_Kunde;

 private Collection c_UpdateKunde;

 // Konstruktor
 public Kunde() {
 }

 // getter und setter-Methoden
 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public String getPlz() {
  return plz;
 }

 public void setPlz(String plz) {
  this.plz = plz;
 }

 public String getOrt() {
  return ort;
 }

 public void setOrt(String ort) {
  this.ort = ort;
 }
 public double getKontostand() {
  return kontostand;
 }

 public void setKontostand(double kontostand) {
  this.kontostand = kontostand;
 }

 public boolean getBonitaet() {
  return bonitaet;
 }

 public void setBonitaet(boolean bonitaet) {
  this.bonitaet = bonitaet;
 }

 public Collection getUI_Kunde() {
  return uI_Kunde;
 }

 public void setUI_Kunde(Collection uI_Kunde) {
  this.uI_Kunde = uI_Kunde;
 }

 public Collection getC_UpdateKunde() {
  return c_UpdateKunde;
 }

 public void setC_UpdateKunde(Collection c_UpdateKunde) {
  this.c_UpdateKunde = c_UpdateKunde;
 }

 // Business-Methoden
 public void erstelleKunde(String name) {

  try {

   String query = 
            "select * from mvcbeispiel where name = '" + name + "';";

   Class.forName(DBDriver);

   Connection con = DriverManager.getConnection(url);
   Statement stmt = con.createStatement();
   ResultSet rs = stmt.executeQuery(query);

   while (rs.next()) {

    this.setName(String.valueOf(rs.getString("name")));
    this.setPlz(String.valueOf(rs.getString("plz")));
    this.setOrt(String.valueOf(rs.getString("ort")));
    Double pufferKontostand = 
             new Double(String.valueOf(rs.getString("kontostand")));
    this.setKontostand(pufferKontostand.doubleValue());

    System.out.println("Kunde wurde aus Datenbank ermittelt");
   }

   stmt.close();
   con.close();
  }
  catch (ClassNotFoundException cnfe) {

   System.out.println(cnfe.getMessage());
  }
  catch (SQLException sqle) {

   System.out.println(sqle.getMessage());
  }
 }

 void hatBonitaet(double auftWert) {

  if((this.kontostand - auftWert) >= 0) { // Bonitaet vorhanden

   this.setBonitaet(true);
  }
  else { // keine Bonitaet

   this.setBonitaet(false);
  }
 }


 boolean speichere() {
  return false;
 }

 boolean loesche() {
  return false;
 }
}

Tab. 3.4: Datei Kunde.java --> Model

Das Model enthält neben den gesamten Attributen, die das Objekt beschreiben auch gewisse Methoden.

Diese Methoden bestehen aus den getter/setter- und den Businessmethoden.

Getter/Setter-Methoden ermöglichen den Zugriff (ändern/set und holen/get) auf die Attribute von außen.

Businessmethoden enthalten Vorgänge, die mit dem Model zusammenhängen und von der Benutzeroberfläche (Controller und View) völlig unabhängig sind. In diesem Beispiel ist das die Methode hatBonitaet(double). Hier wird der Kontostand des Kunden mit dem übergebenen Auftragswert verglichen (einfache Subtraktion), wobei das boolsche Attribut bonitaet dadurch manipuliert wird.

UML-Diagramme

Im nächsten Abschnitt wird anhand der UML-Diagramme genauer auf den Programmablauf eingegangen.