19.3 GUI für den Datenbankzugriff

Zur Verwaltung der in der Datenbank artikelverwaltung gespeicherten Artikel erstellen wir nun beispielhaft eine einfache GUI.

img/Abb_19_24_FensterArtikelverwaltung.jpg
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

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.

  1. beenden() Lösung
    Lösung
    JAVA
    private void beenden() {
        this.dispose();
        System.exit(0);
    }
    Abb. 19-26: Die Methode beenden() (Quellcode)
  2. 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)
  3. 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)
  4. 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)
  5. 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)
  6. 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)
  7. 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)
  8. 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)