# Java Gui Strukturieren



## mister-man (30. Jul 2012)

Hallo miteinander,

ich ein grundlegendes Problem mit meiner Gui in einem Projekt.
Derzeit besitzt mein Projekt eine "Superklasse" Namens Gui, in dem die Fenster alle beim Start gebaut werden, dann unsichtbar gemacht werden.

Bisher ging auch alles soweit gut, nur wenn Textboxen etc ins spiel kommen, bleiben alle alten Informationen enthalten (Das fenster wurde ja beim schließen nur unsichtbar gemacht).

Nun bin ich angefangen alle Fenster in einzelnen Non Static klassen neu zu bauen. Für jedes fenster jeweils eine Instans zu öffnen. Doch lässt sich nun das Fenster nicht mehr auf dem panal hinzufügen.

Nun meine eigendliche Frage:
Wie strukturiere ich es richtig und gibt es vielleicht ein Beispiel bereits dafür.
Habe die Sufu genutzt, werde aber nicht richtig schlau daraus, lese nur oft, das es Geschmackssache ist....



Danke im voraus !


----------



## vanny (30. Jul 2012)

Woos???:L

Du hast also ein Programm, dass eine GUI besitzt.
Dann hätte ich da mal die Frage, ob und warum du mehrere Fenster benötigst.?
Ich denke mal, du suchst nach etwas wie dem CardLayout.

Womit arbeitest du, Swing? AWT? ... zeig mal Code.

Tutorials und Anleitungen gibt es hier und im Netz noch und nöcher.
Wenn du dein Problem mal etwas genauer schilderst (und bitte lies dir nochmal durch, was du da geschrieben hast:autsch, dann kann man dir auch helfen.

Gruß Vanny


----------



## mister-man (31. Jul 2012)

Okay, stimmt. Die Beschreibung war nicht so toll. Sahß zu diesem Zeitpunkt aber schon einige Stunden voller Verzweiflng am PC XD (so sah da mein Kopf aus XD )

Für die Gui nutze ich derzeit Swing und den Netbeans Gui Designer, der standartmäßig an Bort ist.
Im ersten Gui entwurf habe ich Quasi eine Superklasse mit der vollständigen Gui in einer Klasse gebaut. Das ergebniss sind 10000 Zeilen +-. Dabei haben die Buttons etc ncoh keien Funktion.
Dann habe ich der Übersicht halber Steuerklassen für Nutzeraktionen, Statistik,.... gebaut. In dieser werden die Guielemente (Knöpfe, Listen, Textfelder) übergeben und dort ist der Funktionale Code enthalten.

Das sah dann etwa so im Gui Code:


```
user.login(anBenutzernameTFeld, anPasswordPFeld, Uebersicht, Anmelden, mDatei,
                mTerminverwaltung, mBeleg, mStatistik, mKunde, mRaum, mKontingente, 
                mBenutzer, mRollen, mEinstellungen, MenuBar);
```

Die user.login sah dann so aus:


```
public static void login(JTextField anBenutzernameTFeld, JPasswordField anPasswordPFeld,
            JInternalFrame Uebersicht, JPanel Anmelden, JMenu mDatei, JMenu mTerminverwaltung,
            JMenu mRechnung, JMenu mStatistik, JMenu mKunde, JMenu mRaum, JMenu mKontingente,
            JMenu mBenutzer, JMenu mRollen, JMenu mEinstellungen, JMenuBar MenuBar)
   {
       String name = anBenutzernameTFeld.getText();
       String pw = String.valueOf(anPasswordPFeld.getPassword());
       
       // Suche Benutzer ID
       List bid_list = suche.benutzer(name, "", "");
       String bid = (String) bid_list.get(0);
       if (!"NULL".equals(bid))
       {
           if (name.length() > 0 && pw.length() > 0)
           {
                // Erzeuge Benutzer
                benutzer benutzer = new benutzer();
                // Lade Benutzerx
                benutzer.laden(bid);
                // Prüfe Login
                if (hash.md5(pw).equals(benutzer.getPw()))
                {
                    // Setze session Informationen
                    main.lTimestamp = timestamp.getTimestamp();
                    main.aTimestamp = main.lTimestamp;
                    main.lOk = true;
                    main.bNname = benutzer.getNname();
                    main.bVname = benutzer.getVname();
                    main.login = benutzer.getLogin();
                    main.lTimestamp = timestamp.getTimestamp();

                    // Login OK
                    Uebersicht.setVisible(true);//öffnent das übersichtsfenster
                    Anmelden.setVisible(false);//schließt das Anmeldefenster
                    mDatei.setEnabled(true);
                    mTerminverwaltung.setEnabled(true);
                    mRechnung.setEnabled(true);
                    mStatistik.setEnabled(true);
                    mKunde.setEnabled(true);
                    mRaum.setEnabled(true);
                    mKontingente.setEnabled(true);
                    mBenutzer.setEnabled(true);
                    mRollen.setEnabled(true);
                    mEinstellungen.setEnabled(true);
                    MenuBar.setVisible(true);

                }
                else
                {
                    // Login falsch (Passwort)
                    final ImageIcon icon = new ImageIcon(user.class.getResource("/de/roomIT/inter/iconerror.png"));
                    JOptionPane.showMessageDialog(null, "Benutzername oder Passwort falsch", "Falsche Anmeldeinformationen", JOptionPane.ERROR_MESSAGE, icon);
                }
           }
           else
           {
               // Login falsch (Benutzername
               final ImageIcon icon = new ImageIcon(user.class.getResource("/de/roomIT/inter/iconerror.png"));
               JOptionPane.showMessageDialog(null, "Benutzername oder Passwort falsch", "Falsche Anmeldeinformationen", JOptionPane.ERROR_MESSAGE, icon);
           }
       }
       else
       {
           // Login falsch (Benutzername
           final ImageIcon icon = new ImageIcon(user.class.getResource("/de/roomIT/inter/iconerror.png"));
           JOptionPane.showMessageDialog(null, "Benutzername oder Passwort falsch", "Falsche Anmeldeinformationen", JOptionPane.ERROR_MESSAGE, icon);
       }
       anPasswordPFeld.setText("");//entfernt dei zeichen aus dem Passwordfeld
   }
```

Wie man im code sieht, werden beim öffnen der Fenster nur die bereits erstellten fenster sichtbar gemacht. Beim schließen undsichtbar. Deshalb müssen die eingegeben Inhalte dann auch aus den Feldern gelöscht werden.

Im 2ten Interfaceentwurf habe ich nun jedes der Fenster in meinem Menu in einer eigenen Klasse gebaut. Dann habe ich einem Klasse entworfen um die Instanzen der verschiedenen Fenster zu verwalten.

Diese sieht wie folgt aus (auszug):


```
public class sessionHandler {
    
    private static roomITinterface room = null;
    private static Login login = null;
    private static Overview overview = null;
    // ......
    
    //Instanz für das Hauptfenster
    public static void newMain()
    {
        if(sessionHandler.room == null)
        {
            sessionHandler.room = new roomITinterface();
        }
    }
    //Instanz wird zerstört
    public static void delMain()
    {
        sessionHandler.room = null;
    }
    //Instanz wird geholt
    public static roomITinterface getMain()
    {
        return sessionHandler.room;
    }
    //Instaz für das Anmeldefernster wird erstelt
    public static void newLogin()
    {
        if(sessionHandler.login == null)
        {
            sessionHandler.login = new Login();
        }
    }
    //Instanz zerstören
    public static void delLogin()
    {
        sessionHandler.login = null;
    }
    //Instanz holen
    public static Login getLogin()
    {
        return sessionHandler.login;
    }

    // ....
}
```

Aus der Steuerklasse dann wird die Gui wie folgt angesprochen:


```
public static void login()
   {
       String name = sessionHandler.getLogin().getLoginnameTF().getText();
       String pw = String.valueOf(sessionHandler.getLogin().getPasswordPF().getPassword());
       
       
       // Suche Benutzer ID
       List bid_list = suche.benutzer(name, "", "");
       String bid = (String) bid_list.get(0);
       if (!"NULL".equals(bid))
       {
           if (name.length() > 0 && pw.length() > 0)
           {
                // Erzeuge Benutzer
                benutzer benutzer = new benutzer();
                // Lade Benutzerx
                benutzer.laden(bid);
                // Prüfe Login
                if (hash.md5(pw).equals(benutzer.getPw()))
                {
                    // Setze session Informationen
                    main.lTimestamp = timestamp.getTimestamp();
                    main.aTimestamp = main.lTimestamp;
                    main.lOk = true;
                    main.bNname = benutzer.getNname();
                    main.bVname = benutzer.getVname();
                    main.login = benutzer.getLogin();
                    main.lTimestamp = timestamp.getTimestamp();

                    // Login OK
                    gui.Mainscreen();
                    gui.clogin();

                }
                else
                {
                    // Login falsch (Passwort)
                    final ImageIcon icon = new ImageIcon(user.class.getResource("/de/roomIT/inter/iconerror.png"));
                    JOptionPane.showMessageDialog(null, "Benutzername oder Passwort falsch", "Falsche Anmeldeinformationen", JOptionPane.ERROR_MESSAGE, icon);
                }
           }
           else
           {
               // Login falsch (Benutzername
               final ImageIcon icon = new ImageIcon(user.class.getResource("/de/roomIT/inter/iconerror.png"));
               JOptionPane.showMessageDialog(null, "Benutzername oder Passwort falsch", "Falsche Anmeldeinformationen", JOptionPane.ERROR_MESSAGE, icon);
           }
       }
       else
       {
           // Login falsch (Benutzername
           final ImageIcon icon = new ImageIcon(user.class.getResource("/de/roomIT/inter/iconerror.png"));
           JOptionPane.showMessageDialog(null, "Benutzername oder Passwort falsch", "Falsche Anmeldeinformationen", JOptionPane.ERROR_MESSAGE, icon);
       }
       sessionHandler.getLogin().setPasswordPF("");//entfernt dei zeichen aus dem Passwordfeld
   }
```


Die Grundfrage ist nun, bin ich eher mit dem ersten oder dem 2ten versuch auf dem richtigen weg? Oder gehe ich mit beiden versuchen den falschen weg. Persönlich gefällt mir der 2te beschriebene Weg besser, doch sollte es ja auch richtig sein....

Bin derzeit ratlos?!  :bahnhof:


----------



## Cola_Colin (31. Jul 2012)

Allgemein gesagt: Erzeuge ein neues Fensterobjekt, wenn du es brauchst und zerstöre es, wenn du es nicht mehr benötigst. Die Methoden dazu gehören dann alle jeweils in die Klasse des jeweiligen Fensters.

Die Datenhaltung gehört sowieso in eine seperate Klasse.

Also eher dein zweiter Weg als der erste. Irgendwelche Frame zu recyclen ist unnötig und macht nur Probleme


----------



## mister-man (31. Jul 2012)

Okay, dann sag ich schonmal danke. Die Antwort war klar und deutlich.
Beim googleln fand ich leider oft die Antwort: Wie es dir gefällt......


Danke !


----------

