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
- Interfaces MouseListener und WindowListener implementieren.
- Interfacemethoden gegebenenfalls ausprogrammieren.
Ereignisdelegation
- Partner kennen
- 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. |
|