19.3 GUI für den Datenbankzugriff
Zur Verwaltung der in der Datenbank artikelverwaltung gespeicherten Artikel erstellen wir nun beispielhaft eine einfache GUI.
Abb. 19-24: Fenster Artikelverwaltung
Abb. 19-25 zeigt, dass ein Objekt der GUI-Klasse FensterArtikelverwaltung
ein Objekt der speziellen Datenbankzugriffsklasse DBZugriffArtikel
kennt und direkt auf dessen Dienste zugreifen kann. Gemäß der strengen Schichtenarchitektur ist dies verboten. Hier dürfen Methoden anderer Objekte nur dann aufgerufen werden, wenn diese Objekte der gleichen oder der nächstniedrigeren Schicht angehören.
Um diese Anforderung in unserem Beispiel zu erfüllen, müssten wir einen Umweg über eine Klasse der Fachkonzeptschicht gehen. Da unser Beispiel keine weiteren fachlichen Funktionalitäten bietet, die über die bloße Pflege von Artikeldaten hinausgeht, würden sich die Dienste dieser Klasse auf das bloße Weiterreichen der Aufrufe von FensterArtikelverwaltung
an DBZugriffArtikel
beschränken. Dies bedeutet in unserem Fall einen Umweg ohne Mehrwert. Wir verzichten daher darauf und verfolgen damit eine flexible Schichtenarchitektur , die Aufrufe innerhalb der gleichen Schicht und in jede niedrigere Schicht erlaubt.
img/Abb_19_25_UML_GUI_DBZugriff.svg
Abb. 19-25: Artikelverwaltung (UML-Klassendiagramm)
Aufgabe 19-14: FensterArtikelverwaltung
Erstellen Sie für die Klasse FensterArtikelverwaltung
den Quellcode der in den Teilaufgaben a) bis h) genannten Methoden. Fangen Sie mögliche Ausnahmen ab und informieren Sie den Benutzer entsprechend.
beenden()
Lösung
Lösung
JAVA
private void beenden() {
this .dispose();
System.exit(0);
}
Abb. 19-26: Die Methode beenden()
(Quellcode)
leereEinAusgabe()
Lösung
Lösung
JAVA
private void leereEinAusgabe() {
tfArtNr .setText("" );
tfArtBez .setText("" );
tfVkPreis .setText("" );
tfBestand .setText("" );
taAnzeige .setText("" );
}
Abb. 19-27: Die Methode leereEinAusgabe()
(Quellcode)
erzeugeArtikelAusTf()
Lösung
Lösung
JAVA
private Artikel erzeugeArtikelAusTf() {
Artikel artikel = null ;
String artNr = tfArtNr .getText();
String artBez = tfArtBez .getText();
double vkPreis ;
int bestand ;
try {
//Prüfe eingegebene Artikelnummer
int zahl = Integer.parseInt(artNr );
if (zahl <10000 || zahl >99999) {
throw new NumberFormatException();
}
try {
//Prüfe eingegebenen Preis
vkPreis = Double.parseDouble(tfVkPreis .getText().replaceFirst("," ,"." ));
if (vkPreis <=0) {
throw new NumberFormatException();
}
try {
//Prüfe eingegebenen Bestand
bestand = Integer.parseInt(tfBestand .getText());
if (bestand <0) {
throw new NumberFormatException();
}
//Erzeuge auf Grundlage der eingegebenen Daten ein Artikel-Objekt
artikel = new Artikel(artNr );
artikel .setArtBez(artBez );
artikel .setVkPreis(vkPreis );;
artikel .setBestand(bestand );
}
catch (NumberFormatException nfEx) {
JOptionPane.showMessageDialog(this , "Bitte geben Sie als Lagerbestand 0 oder eine positive ganze Zahl ein!" );
}
}
catch (NumberFormatException nfEx) {
JOptionPane.showMessageDialog(this , "Bitte geben Sie als Verkaufspreis eine positive Zahl ein!" );
}
}
catch (NumberFormatException nfEx) {
JOptionPane.showMessageDialog(this , "Bitte geben Sie als Artikelnummer eine positive fünfstellige Zahl ein!" );
}
return artikel ;
}
Abb. 19-28: Die Methode erzeugeArtikelAusTf()
(Quellcode)
zeigeArtikelliste()
Lösung
Lösung
JAVA
private void zeigeArtikelliste() {
ArrayList<Artikel> artikelliste = dbZugriffArtikel .erstelleArtikelliste();
Artikel artikel ;
if (artikelliste .size() > 0) {
leereEinAusgabe();
for (int i =0; i <artikelliste .size(); i ++) {
artikel = artikelliste .get(i );
taAnzeige .append(artikel .getArtNr());
taAnzeige .append("\t" + artikel .getVkPreis());
taAnzeige .append("\t" + artikel .getBestand());
taAnzeige .append("\t" + artikel .getArtBez());
if (i <artikelliste .size()-1) {
taAnzeige .append("\n" );
}
}
taAnzeige .setCaretPosition(0); //Kann der Text nicht komplett gezeigt werden, zeige den Anfang.
}
else {
JOptionPane.showMessageDialog(this , "Es sind keine Artikel gespeichert!" );
}
}
Abb. 19-29: Die Methode zeigeArtikelliste()
(Quellcode)
suchen()
Lösung
Lösung
JAVA
private void suchen() {
String artNr ;
Artikel artikel = null ;
artNr = tfArtNr .getText();
artikel = dbZugriffArtikel .ladeArtikel(artNr );
if (artikel != null ) {
leereEinAusgabe();
tfArtNr .setText(artikel .getArtNr());
tfArtBez .setText(artikel .getArtBez());
tfVkPreis .setText("" + artikel .getVkPreis());
tfBestand .setText("" + artikel .getBestand());
}
else {
JOptionPane.showMessageDialog(this , "Unter der Artikelnummer '" + artNr + "' ist kein Artikel gespeichert!" );
}
}
Abb. 19-30: Die Methode suchen()
(Quellcode)
anlegen()
Lösung
Lösung
JAVA
private void anlegen() {
Artikel artikel = this .erzeugeArtikelAusTf();
taAnzeige .setText("" );
if (artikel !=null ) {
if (!dbZugriffArtikel .istArtNrVergeben(artikel .getArtNr())) {
if (dbZugriffArtikel .erfasseNeuenArtikel(artikel )) {
JOptionPane.showMessageDialog(this , "Neuer Artikel '" + artikel .getArtNr() + "' wurde gespeichert." );
}
else {
JOptionPane.showMessageDialog(this , "Der Artikel '" + artikel .getArtNr() + "' konnte nicht angelegt werden." );
}
}
else {
JOptionPane.showMessageDialog(this , "Der Artikel '" + artikel .getArtNr() + "' kann nicht angelegt werden,\nda in der Datenbank bereits ein Artikel mit dieser Artikelnummer existiert!" );
}
}
}
Abb. 19-30: Die Methode anlegen()
(Quellcode)
aendern()
Lösung
Lösung
JAVA
private void aendern() {
Artikel artikel = this .erzeugeArtikelAusTf();
taAnzeige .setText("" );
if (artikel !=null ) {
if (dbZugriffArtikel .istArtNrVergeben(artikel .getArtNr())) {
if (dbZugriffArtikel .aendereArtikel(artikel )) {
JOptionPane.showMessageDialog(this , "Der geänderte Artikel '" + artikel .getArtNr() + "' wurde gespeichert." );
}
else {
JOptionPane.showMessageDialog(this , "Der geänderte Artikel '" + artikel .getArtNr() + "' konnte nicht gespeichert werden." );
}
}
else {
JOptionPane.showMessageDialog(this , "In der Datenbank ist kein Artikel mit der Artikelnummer '" + artikel .getArtNr() + "' gespeichert!" );
}
}
}
Abb. 19-31: Die Methode aendern()
(Quellcode)
loeschen()
Lösung
Lösung
JAVA
private void loeschen() {
String artNr = tfArtNr .getText();
if (dbZugriffArtikel .istArtNrVergeben(artNr )) {
if (dbZugriffArtikel .loescheArtikel(artNr )) {
JOptionPane.showMessageDialog(this , "Der Artikel mit der Artikelnummer '" + artNr + "' wurde gelöscht!" );
leereEinAusgabe();
}
else {
JOptionPane.showMessageDialog(this , "Der Artikel mit der Artikelnummer '" + artNr + "' konnte nicht gelöscht werden!" );
}
}
else {
JOptionPane.showMessageDialog(this , "In der Datenbank ist kein Artikel mit der Artikelnummer '" + artNr + "' gespeichert!" );
}
}
Abb. 19-32: Die Methode loeschen()
(Quellcode)