Swing-MVC: JFrame verstecken und anderes anzeigen

OlliL

Bekanntes Mitglied
Hallo,

ich habe eine Designfrage.

Ich bin dabei eine Applikation in mit Swing zu entwickeln und habe bisher Erfahrung mit SpringMVC, und möchte daher auch in Swing im MVC-Style entwickeln.

Nun zur Applikation:
Bevor die eigentliche Applikation startet, soll der User in einem extra JFrame sich mittels Benutzername/Passwort authentifizieren.
Nachdem diese Anmeldung geglückt ist, soll dieses JFrame verschwinden und die eigentliche Anmeldung - ein weiteres JFrame - soll sich öffnen.

Mein Design sieht bisher so aus:

1. ich habe ein LogonModel welches Observable erweitert.
- das LogonModel hat 2 private Variablen username+passwort und kümmert sich um das abgleichen dieser mit dem Backend über ein DAO via der Funktion doLogin().
- Stimmen username und passwort nicht überein, wird eine Fehlermeldung definiert und diese mittels notifyObservers(error) an die View zur Darstellung gegeben (z.B. Username leer, Passwort leer, Username oder Passwort falsch). Im Erfolgsfall wird eine leere Fehlermeldung zurück gegeben.

2. ich habe eine LogonView welche Observer implementiert.
- mit der update() Funktion wird die Fehlermeldung in einem sonst leeren JLabel dargestellt.

3. ich habe einen Controller welcher ActionListener implementiert.
- mittels actionPerformed wird username und passwort des Models gesetzt, und dann doLogin() des Models aufgerufen.


Beim Startup werden nun LogonModel und LogonView instanziert. LogonView wird als Observer beim LogonModel hinzugefügt.
Dem Controller wird LogonModel und LogonView hinzugefügt, und dem Button wird der Controller zugewiesen.

Das funktioniert alles soweit wunderbar. Nur frage ich mich nun.... wo bzw. wie soll ich nun die LogonView verstecken, und eine neue MainView öffnen?

Eine Möglichkeit welche mir gerade kommt ist:
1.) Ich könnte die MainView auch bereits komplett fertig bauen, jedoch mit setVisible(false).
2.) Dann könnte ich MainView auch als einen weiteren Observer dem LogonModel hinzufügen.
3.) Sollte dann das LogonModel mit einer leeren Fehlermeldung ankommen (=Logon erfolgreich) verstecke ich im update() des LogonScreen selbigen, und im MainScreen.update() wird dann setVisible(true) ausgefuehrt.
Irgendwie finde ich das aber nicht wirklich "sauber" und frage mich, ob es nicht eine bessere Möglichkeit gibt das beschriebene Problem zu loesen...

Gruesse
 
C

Camino

Gast
Nimm doch für die Anmeldung (Login) einen JDialog und für deine Hauptanwendung einen JFrame. Dann kommt bei Programmstart zuerst der JDialog mit dem Login und der Überprüfung und je nach Eingabe wertes du das aus und machst weiter mit dem JFrame (oder auch nicht).
 

KrokoDiehl

Top Contributor
Nun im MVC kümmiert sich der Controller um die Steuerung. Das heißt dein LogonController sollte auch das schließen des LogonViews und das Öffnen des MainViews (bzw. über einen MainController) erledigen.

Dass ein MainView auch noch auf das LogonModel achtet ist m.E. auch unsauber. MVC kann in der Praxis immer etwas anders aussehen, daher schreibe ich mal, wie ich es in etwa machen würde, hier in Pseudocode:

Java:
class LogonView {
...
        JButton btnLogin = ...;
        btnLogin.addActionListener(new ActionListener() {
            public void actionPerformed(...) {
                logonCtrl.tryLogin();
            }
        };
...
}

class LogonController {
...
    public void tryLogin() {
        LogonView view = getView();

        // wie auch immer du die Logindaten prüfst...
        try {
            getModel().checkLogin(view.getUser(), view.getPassword());
        }
        catch (LoginException exc) {
            view.showError(...);    
            return;
        }

        view.close(); 
        //ggfs weiteres aufräumen
        new MainController().start(); 
    }

Ich hoffe es ist damit klar, wie der Zusammenhang zwischen den Dreien ist. Tatsächlich hat der View hier wenig mit dem Modell direkt zutun. Aber Logins sind dafür auch eher untypische Beispiel ;)
 

bERt0r

Top Contributor
Wenn du das alles auf rein MVC machen willst, sollte dein Model beim erfolgreichen Login ein Event werfen. Das Event kann dann von einem übergeordneten Controller abgefangen werden der dann die View ändert (von Login zu Mainview).
 

OlliL

Bekanntes Mitglied
So in etwa hatte ich es "vorher" auch. Ich meine: die View selber war ActionListener welcher nur den Controller aufrief und danach den Fehler angezeigt hat. Der Controller selber hat dann das Login gemacht, dann ggf. die Logon-Ansicht versteckt und die Main-Ansicht angezeigt oder eben einen Fehler zurueckgemeldet.

Dann.... bin ich aber auf The simplest Model View Controller (MVC) Java example gestoßen und fand das ganze als Observer Pattern zu realisieren wesentlich besser.

Nun stehe ich aber halt vor dem Problem, das mein Controller eigentlich nur das actionPerformed macht:

Java:
public class LogonController implements ActionListener{
	private LogonModel model;
	private LogonScreen view;

	public void actionPerformed(ActionEvent e) {
		model.setUsername(view.getUsername());
		model.setPassword(view.getPassword());
		model.doLogin();
	}

	public void addModel (LogonModel m) {
		this.model = m;
	}
	
	public void addView(LogonScreen v) {
		this.view = v;
	}
}

Nun könnte ich natürlich im actionPerformed auch die view verstecken (view.setVisible(false)) und dann das ganze MainView Gedöns "loslegen" aber ist das sauber?


Java:
	public void actionPerformed(ActionEvent e) {
		model.setUsername(view.getUsername());
		model.setPassword(view.getPassword());
		if (model.doLogin()) {
			view.setVisible(false)
			MainModel mmodel = new MainModel();
			MainView mview = new MainView();

			mmodel.addObserver(mview);

			MainController controller = new MainController();
			controller.addModel(mmodel);
			controller.addView(mview);

			mview.addController(controller);
		}
	}

Irgendwie empfinde ich es als unsauber dies im actionPerformed in meinem LogonController zu "verstecken".
Irgendwie habe ich das Gefühl einen "Übercontroller" zu brauchen der sich nur darum kümmert:
- Programmstart -> LogonView anzeigen
- LogonView sagt "User hat sich angemeldet"
- LogonView verstecken
- MainView anzeigen
Das empfinde ich irgendwie als sauberer - oder empfinde ich falsch? ;)

Edit: bERt0r scheint genau das zu empfehlen - einen "Übercontroller" - mein Empfinden scheint nicht so falsch zu sein :) :)
Events.... muss ich mich mal mit beschäftigen.
 
Zuletzt bearbeitet:

KrokoDiehl

Top Contributor
Dein genanntes Beispiel mit dem "simplest mvc" macht aber doch auch das, was ich vorgeschlagen habe:

Aktionen die im View ausgelöst werden, werden im Controller behandelt. Meistens löst das was im Modell aus. Das Modell propagiert Änderungen über Listener/Oberserver-Muster worauf der View und ggfs. auch der Controller reagieren kann.

Wie gesagt ist da Login-Beispiel ungünstig um MVC zu erklären, da es keine Daten zum anzeigen gibt, vielmehr geht es um einen Zustand "eingeloggt/ausgeloggt".
Ich halte es daher nicht für unsauber, dass der Controller die Fehlerbehandlung (Logindaten falsch) übernimmt.
Man kann es natürlich auch weiter aufteilen:
1. View: Beim Klick auf "Login" leitet der Ctrl es direkt ans Modell weiter
2. Modell: Das Modell prüft Logindaten und löst danach Event/Oberserver aus: Ok oder Fehlgeschlagen
3. View: Reagiert je nach Event anders: Beim Ok geht es wieder an den Ctrl und sagt: LoginOk, Schließ mich und starte Hauptanwendung. Bei Fehlgeschlagen gibts halt ne Meldung.

Aber der Vorschlag mit dem "Über"controller ist natürlich auch ein gangbarer Weg, den ich nicht für unsauber halte. Höchstens für etwas zu gekünstelt :)
Aber Meinungen können diesbezüglich auseinander gehen. Ich hoffe ich konnte zumindest verdeutlichen, dass es durchaus mehrere Lösungen / Wege gibt :)
 

OlliL

Bekanntes Mitglied
Jo, du hast schon recht, aber ich glaube, diese Event-Geschichte kann ich spaeter auch noch gebrauchen.

Meine "Hauptanwendung" besteht aus mehreren JPanels welche über ein Menu eingeblendet werden (Quasi "Option 1" -> Zeige Jpanel 1, "Option 2" -> Verstecke Jpanel 1, zeige Jpanel 2)

Das koennte man dann ja auch über den Eventhandler machen. Man haette dann quasi eine Stelle die sich nur um die "Menusteuerung" der Applikation kümmert, Frames und/oder Panels anzeigt.

Andernfalls würde man diese Steuerung in dem Controller des Logon-Frames unterbringen und in dem Controller des Menu-Frames... geht alles, klar, aber "eine Stelle" find ich irgendwie mehr sexy ;)
 

bERt0r

Top Contributor
Was ich noch sagen wollte, wenn du willst brauchst du auch nicht eigene Events zu verwenden sondern kannst z.B auf ChangedEvents oder PropertyChangedEvents zurückgreifen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Swing: JFrame nach oben "aufklappen" AWT, Swing, JavaFX & SWT 0
S Nachträglich Swing-Elemente in JFrame erzeugen AWT, Swing, JavaFX & SWT 18
M JScrollPane im JPanel im JFrame SWING AWT, Swing, JavaFX & SWT 4
B Swing und Sockets: JFrame wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
G Swing Jframe Problem AWT, Swing, JavaFX & SWT 4
A Swing JFrame / JPanel Grösse soll sich nach Inhalt richten. AWT, Swing, JavaFX & SWT 2
S Swing - JFrame ansprechen AWT, Swing, JavaFX & SWT 2
Juelin javax.swing in javafx AWT, Swing, JavaFX & SWT 1
A Eclipse 2023 und Swing AWT, Swing, JavaFX & SWT 4
W 2 JTables in einem Swing-Fenster? AWT, Swing, JavaFX & SWT 5
H Swing Componente zur Läufzeit ändern AWT, Swing, JavaFX & SWT 3
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
ExceptionOfExpectation Anpassung von JKomponentengrößen (Swing) AWT, Swing, JavaFX & SWT 3
thor_norsk AWT SWING Aufgabe AWT, Swing, JavaFX & SWT 7
U Zwei Fragen zu eienr Swing Aufgabe AWT, Swing, JavaFX & SWT 2
M Swing Bilder in Swing anzeigen AWT, Swing, JavaFX & SWT 9
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
H Simple Animation mit Swing AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
A Swing ProgressBar über 2 parallel laufende Threads AWT, Swing, JavaFX & SWT 2
M Swing GridLayout AWT, Swing, JavaFX & SWT 2
O return-Statement mit Swing AWT, Swing, JavaFX & SWT 6
O Ein Java-Programm mit Swing steuern AWT, Swing, JavaFX & SWT 1
Monokuma Swing zu JavaFX AWT, Swing, JavaFX & SWT 5
J Swing Slider AWT, Swing, JavaFX & SWT 11
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
G Swing JPasswordField AWT, Swing, JavaFX & SWT 12
L Swing Button Farbe ändern/wechseln AWT, Swing, JavaFX & SWT 2
C Swing AWT GUI Anfänger Aufgabe AWT, Swing, JavaFX & SWT 7
W Inject bei einem Swing Frontend AWT, Swing, JavaFX & SWT 8
L Kommunikation zwischen Klassen / Konstruktoren bei Swing AWT, Swing, JavaFX & SWT 9
M Feldvalidierung swing AWT, Swing, JavaFX & SWT 4
E Swing Componenten werden nach Änderung des display modes verzerrt dargestellt AWT, Swing, JavaFX & SWT 8
D [Swing] Anordnung von Komponenten mit GridLayout Manager AWT, Swing, JavaFX & SWT 13
O Zukunft von Swing und JavaFX ? AWT, Swing, JavaFX & SWT 3
S Swing Fenster State Machine AWT, Swing, JavaFX & SWT 1
T Swing Swing an Bildschirm anpassen AWT, Swing, JavaFX & SWT 3
S Swing Panel wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
M Swing Java Swing/AWT Combobox Bug AWT, Swing, JavaFX & SWT 3
M Swing GUI mittels erben sowie variabler Dateninhalt AWT, Swing, JavaFX & SWT 1
W Swing Multitouch mit Swing AWT, Swing, JavaFX & SWT 6
S Swing-Applikation die ein Numpad nachbildet samt Keybindings..? AWT, Swing, JavaFX & SWT 5
S Swing Java Swing AWT, Swing, JavaFX & SWT 6
Blender3D Problem mit € Symbol Font Gotham Windows 10 Swing AWT, Swing, JavaFX & SWT 11
J Swing oder JavaFX AWT, Swing, JavaFX & SWT 21
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
D SQL Statements mit Java Swing benutzen AWT, Swing, JavaFX & SWT 4
Damtonix BufferStrategy flackert (Swing) AWT, Swing, JavaFX & SWT 9
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
B JavaFX oder swing AWT, Swing, JavaFX & SWT 3
T Java Swing - kleines Rechteck unter dem cursor AWT, Swing, JavaFX & SWT 5
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
L Swing Größe automatisch anpassen AWT, Swing, JavaFX & SWT 14
G Swing Swing Binding JList funktioniert nicht AWT, Swing, JavaFX & SWT 5
Blender3D Meine Swing Anwendung läuft unter Windows 10 und Ubuntu aber nicht auf Windows 7 AWT, Swing, JavaFX & SWT 16
B Bar Plot in Swing JPanel AWT, Swing, JavaFX & SWT 0
D Swing in Kombination mit JGraphX und JGraphT AWT, Swing, JavaFX & SWT 0
F main-Funktion bei Swing AWT, Swing, JavaFX & SWT 4
S Java Swing Print() method AWT, Swing, JavaFX & SWT 4
S Java Swing auf Windows Phone AWT, Swing, JavaFX & SWT 6
I JAVAFX - Übergabe der Inhalte an eine Scene - Wo ist der Vorteil gegenüber Swing? AWT, Swing, JavaFX & SWT 2
S Manuelles Menu in Swing AWT, Swing, JavaFX & SWT 3
T Custom Window ohne Swing / AWT / FX..?! AWT, Swing, JavaFX & SWT 1
MaxG. Swing Swing Komponenten zur Laufzeit hinzufügen AWT, Swing, JavaFX & SWT 2
Java_RY Bin Ratlos bzgl Malen in Swing AWT, Swing, JavaFX & SWT 5
offi Swing Shuttle List AWT, Swing, JavaFX & SWT 9
I Graph mit Swing zeichnen AWT, Swing, JavaFX & SWT 8
D Swing Swing Objekte sehen im Entwurf anders aus als beim Ausführen AWT, Swing, JavaFX & SWT 3
S Swing & Clean und build Problem AWT, Swing, JavaFX & SWT 12
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
K Mit JavaFX angefangen. Lohnt sich Swing? AWT, Swing, JavaFX & SWT 28
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
M Swing Swing-Widgets und paintComponent() AWT, Swing, JavaFX & SWT 2
B Swing WindowBuilde: Menu -> anderes Panel wechseln AWT, Swing, JavaFX & SWT 1
K eigener button in swing AWT, Swing, JavaFX & SWT 3
A JavaFX DatePicker in Swing beim Start nicht sichtbar AWT, Swing, JavaFX & SWT 2
windl Bufferstrategy in Swing nachstellen AWT, Swing, JavaFX & SWT 0
M Kamera in Java Swing einbinden AWT, Swing, JavaFX & SWT 4
Z Swing Swing und die Progressbar AWT, Swing, JavaFX & SWT 1
J Frage zur objektorentierten Swing Programmierung AWT, Swing, JavaFX & SWT 10
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
N Swing Benötige Hilfe um ein Swing Canvas zu speichern AWT, Swing, JavaFX & SWT 4
stylegangsta JButton Fehelr javax.swing.ImageIcon.<init>(Unknown Source) AWT, Swing, JavaFX & SWT 24
RalleYTN Swing JavaFX VideoPlayer in Swing einbetten. Ich komm nicht an die Dimension des Videos! AWT, Swing, JavaFX & SWT 0
T swing läuft nur beding flüssig AWT, Swing, JavaFX & SWT 1
A Sonderzeichen bei Swing AWT, Swing, JavaFX & SWT 3
L DoubleBuffering unter Swing AWT, Swing, JavaFX & SWT 0
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
D Java Swing, Label lässt sich nicht mit Checkboxen/Knopf verändern AWT, Swing, JavaFX & SWT 2
J Swing Basics - JButton funktioniert nicht. AWT, Swing, JavaFX & SWT 1
J Swing/AWT | Dynamisch erzeugte Objekte ansprechen AWT, Swing, JavaFX & SWT 1
N JavaFX Umstieg von Swing auf Java FX AWT, Swing, JavaFX & SWT 6
J GUI Anfänger einfaches Program AWT, Swing, JavaFX & SWT AWT, Swing, JavaFX & SWT 3
M Swing Grundlegende Frage zu SWING mit WindowBuilder AWT, Swing, JavaFX & SWT 11
M Plugin oder eigenes Tool mit zB SWING AWT, Swing, JavaFX & SWT 2
Z Java-Swing : JComponent AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben