Swing Kleines Programm mit SWING unter Verwendung von MVC

Curry

Aktives Mitglied
Moin Moin!

Ich möchte ein kleines Programm schreiben und beginne dafür mit der JAVA-Programmierung.

Bezüglich MVC habe ich mir diesen Artikel (Java SE Application Design With MVC) durchgelesen und das Beispiel studiert. Zur Übung habe ich einen Währungsumrechner, der auf dem Beispielprogramm basiert, geschrieben.

Darauf basierend habe ich begonnen mein kleines Programm zu schreiben, doch habe ich schon bald meine Grenzen aufgezeigt bekommen. In dem Beispielprogramm basieren alle View-Klassen auf der Klasse "AbstractViewPanel" die von "JPanel" abgeleitet ist. Im Großen und Ganzen ist das für mein Programm auch okay, aber das Hauptfenster möchte ich von JFrame ableiten und mit einer JMenuBar versehen.

Der Controller, welcher von der Klasse "AbstractController" abgeleitet ist, kann aber nur View-Klassen aufnehmen, die ihrerseits von der Klasse "AbstractViewPanel" abgeleitet wurden.

Das bereitet mir erhebliche Startschwierigkeiten, da ich nicht weiß, wie ich das Hauptfenster mit seiner Menüleiste in die MVC-Umgebung einbauen soll.

Freue mich auf eure Hilfe!

Hier der Quellcode der abstrakten Klasse "AbstractController":
Java:
package controller;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.lang.reflect.Method;
import java.util.ArrayList;

import view.AbstractViewPanel;
import model.AbstractModel;

public class AbstractController implements PropertyChangeListener {

	//  Vectors that hold a list of the registered models and views for this controller.
	private ArrayList<AbstractViewPanel> registeredViews;
    private ArrayList<AbstractModel> registeredModels;

    // Konstruktor
    public AbstractController() {
        registeredViews = new ArrayList<AbstractViewPanel>();
        registeredModels = new ArrayList<AbstractModel>();
    }
    
    /**
     * Binds a model to this controller. Once added, the controller will listen for all 
     * model property changes and propogate them on to registered views. In addition,
     * it is also responsible for resetting the model properties when a view changes
     * state.
     * @param model The model to be added
     */
    public void addModel(AbstractModel model) {
        registeredModels.add(model);
        model.addPropertyChangeListener(this);
    }
    
    /**
     * Unbinds a model from this controller.
     * @param model The model to be removed
     */
    public void removeModel(AbstractModel model) {
        registeredModels.remove(model);
        model.removePropertyChangeListener(this);
    }
    
    /**
     * Binds a view to this controller. The controller will propogate all model property
     * changes to each view for consideration.
     * @param view The view to be added
     */
    public void addView(AbstractViewPanel view) {
        registeredViews.add(view);
    }

    /**
     * Unbinds a view from this controller.
     * @param view The view to be removed
     */
    public void removeView(AbstractViewPanel view) {
        registeredViews.remove(view);
    }
    
    //  Used to observe property changes from registered models and propogate them on to all the views.
    
    /**
     * This method is used to implement the PropertyChangeListener interface. Any model
     * changes will be sent to this controller through the use of this method.
     * @param evt An object that describes the model's property change.
     */
    public void propertyChange(PropertyChangeEvent evt) {
        
        for (AbstractViewPanel view: registeredViews) {
            view.modelPropertyChange(evt);
        }
    }
    
    
    /**
     * Convienence method that subclasses can call upon to fire off property changes
     * back to the models. This method used reflection to inspect each of the model
     * classes to determine if it is the owner of the property in question. If it
     * isn't, a NoSuchMethodException is throws (which the method ignores).
     *
     * @param propertyName The name of the property
     * @param newValue An object that represents the new value of the property.
     */
    protected void setModelProperty(String propertyName, Object newValue) {
        
        for (AbstractModel model: registeredModels) {
            try {
            	System.out.println("Okay: setModelProperty");
                Method method = model.getClass().getMethod("set" + propertyName, new Class[] { newValue.getClass() });
                method.invoke(model, newValue);
                
            } catch (Exception ex) {
            	System.out.println("Fehler: setModelProperty");
            }
        }
    }
}

Und hier der Quellcode meiner "Main.java":
Java:
import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.WindowConstants;

import model.ExperimentModel;
import model.LogModel;
import view.LogViewPanel;
import view.MenuView;
import controller.DefaultController;

public class Main {

	public static void main(String[] args) {
	
		// Instanzieren der Models
		LogModel logModel = new LogModel();
		ExperimentModel experimentModel = new ExperimentModel();
		
		//model.initDefault();
		
		// Instanzieren der Controller
		DefaultController controller = new DefaultController();
		
		// Instanzieren der Views
		LogViewPanel logViewPanel = new LogViewPanel(controller);
		MenuView menuView = new MenuView(controller);
		
		// Verknüpfen des Controller mit den Views und den Models
		controller.addView(logViewPanel);
		//controller.addView(menuView); // der Methode kann nur ein AbstractViewPanel-Objekt übergeben werden
		controller.addModel(logModel);
		controller.addModel(experimentModel);
		
		JFrame rootFrame = new JFrame("TestTool");
		//rootFrame.setMenuBar(menuView); // der Methode kann nur ein JMenuBar-Objekt übergeben werden
		rootFrame.getContentPane().add(logViewPanel, BorderLayout.CENTER);
		rootFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		rootFrame.pack();
		rootFrame.setVisible(true);
	}
}
 

slawaweis

Bekanntes Mitglied
Der Controller, welcher von der Klasse "AbstractController" abgeleitet ist, kann aber nur View-Klassen aufnehmen, die ihrerseits von der Klasse "AbstractViewPanel" abgeleitet wurden.

Das bereitet mir erhebliche Startschwierigkeiten, da ich nicht weiß, wie ich das Hauptfenster mit seiner Menüleiste in die MVC-Umgebung einbauen soll.
das Hauptfenster und die Menüleiste gehören im MVC in den View (in seine konkrete Implementierung) und nur dorthin. Entweder der Controller, noch das Model sollten direkt auf das Hauptfenster oder die Menüleiste zugreifen, oder darüber überhaupt Bescheid wissen. Das MVC-Model kommuniziert über Events oder vergleichbare Mechanismen. Wenn also im View eine Aktion über ein Menu, Toolbar, Tastatur, Maus, JUnit-Test oder ähnliches ausgelöst wird, sollte diese Aktion vom View vorverarbeitet werden und als ein (vorher selber definiertes) Event an den Controller und/oder Model geschickt werden. Genauso auch umgekehrt. Ein View sollte im optimalen Fall nicht wissen, ob das Model jetzt auf einer CSV-Datei oder lokaler bzw. entfernter Datenbank arbeitet.

Slawa
 

Michael...

Top Contributor
Arbeite statt mit abstrakten Klassen mit Interfaces. Definiere ein ViewInterface, das alle View Klassen implementieren müssen. So kann man eine beliebige Klasse, egal ob sie von JPanel, JFrame oder sonst woher erbt jederzeit als View verwenden.
 
G

Gast2

Gast
Ich würde in der GUI im anonymen Listener arbeiten und die View NICHT im Controller aufnehmen...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Verbesserungsvorschläge?! Kleines AWT Programm AWT, Swing, JavaFX & SWT 4
P Warum braucht mein kleines Programm 20 MB Speicher? AWT, Swing, JavaFX & SWT 13
T Java Swing - kleines Rechteck unter dem cursor AWT, Swing, JavaFX & SWT 5
J Kleines Helikopterspiel programmieren AWT, Swing, JavaFX & SWT 2
T Kleines Infofenster einblenen lassen AWT, Swing, JavaFX & SWT 3
J Kleines Anzeige Problem(nur blanker Frame) AWT, Swing, JavaFX & SWT 22
F Kleines Fenster am Bildschirmrand AWT, Swing, JavaFX & SWT 3
L Kleines Lückenprogrämmchen AWT, Swing, JavaFX & SWT 3
C kleines Chatprogramm, probleme mit JTextArea AWT, Swing, JavaFX & SWT 9
R JTable Header - will links kleines icon hinzufuegen..? AWT, Swing, JavaFX & SWT 6
D Swing Ein kleines Formatierungsproblem AWT, Swing, JavaFX & SWT 9
F kleines problem beim suchen in einem String AWT, Swing, JavaFX & SWT 15
T Ein kleines buntes Farbproblem AWT, Swing, JavaFX & SWT 7
V Thread als kleines splash AWT, Swing, JavaFX & SWT 13
C Mein erstes kleines Swing-Projekt - Probleme AWT, Swing, JavaFX & SWT 8
H Kleines SwingProgramm Frage AWT, Swing, JavaFX & SWT 14
H Kleines Malprogramm AWT, Swing, JavaFX & SWT 36
J kleines Zeichenprogramm AWT, Swing, JavaFX & SWT 12
J Kleines Layout Problem AWT, Swing, JavaFX & SWT 5
B Kleines JFrame Problem (oder doch größer?) AWT, Swing, JavaFX & SWT 2
D Kleines aber dummes Problem mit Turtle. AWT, Swing, JavaFX & SWT 4
Juelin starten maven javafx programm ohne netbeans AWT, Swing, JavaFX & SWT 38
P AWT Programm funktioniert nicht richtig AWT, Swing, JavaFX & SWT 35
G CAD Programm AWT, Swing, JavaFX & SWT 4
thor_norsk E - Mail Programm AWT, Swing, JavaFX & SWT 2
_user_q Über installDist exportiertes Programm wirft "Unsupported JavaFX configuration" AWT, Swing, JavaFX & SWT 0
CodingBerlin JavaFX Programm läuft nur unter Eclipse AWT, Swing, JavaFX & SWT 1
J Programm findet Resource nicht. AWT, Swing, JavaFX & SWT 6
N Programm Läuft nicht auf anderen Pcs AWT, Swing, JavaFX & SWT 9
imawake Java Paket-Tracking Programm 📦 AWT, Swing, JavaFX & SWT 7
S Lustiges programm schnell coden? AWT, Swing, JavaFX & SWT 2
O Ein Java-Programm mit Swing steuern AWT, Swing, JavaFX & SWT 1
P Swing Programm hängt sich bei Buttondruck auf? (GUI für "Chatbot" erstellen) AWT, Swing, JavaFX & SWT 15
M DragAndDrop - aus Browser ins Programm AWT, Swing, JavaFX & SWT 6
T Java GUI - Würfel Programm AWT, Swing, JavaFX & SWT 6
JojoSand Java Programm wird nicht gestartet - keinen Fehlerhinweis AWT, Swing, JavaFX & SWT 9
SvenPittelkow Programm soll auf JButton warten bis der geklickt wurde AWT, Swing, JavaFX & SWT 1
I Gui in bestehendes Java-Programm AWT, Swing, JavaFX & SWT 11
L JavaFX IntelliJ Standalone Programm exportieren AWT, Swing, JavaFX & SWT 9
Bluedaishi JavaFX Programm start mit zwei scenen bzw Fenster AWT, Swing, JavaFX & SWT 1
M AWT Programm in den Tray minimieren AWT, Swing, JavaFX & SWT 2
steven789hjk543 Swing Weiß jemand, warum dieses Programm nicht funktioniert? AWT, Swing, JavaFX & SWT 7
A Java Programm gestalten AWT, Swing, JavaFX & SWT 4
P Swing Warum startet das Programm nicht? AWT, Swing, JavaFX & SWT 3
J JavaFX Kamera im Programm öffnen AWT, Swing, JavaFX & SWT 6
H Hintergrundbild in einem Programm AWT, Swing, JavaFX & SWT 4
MR._FIRE_Flower progressBar in ein bestehendes Programm einbauen AWT, Swing, JavaFX & SWT 3
A Programm nun in ein Frame basteln AWT, Swing, JavaFX & SWT 1
A Swing Programm funktioniert aber zwei Buttons werden angezeigt AWT, Swing, JavaFX & SWT 3
G Zeichnen Programm AWT, Swing, JavaFX & SWT 1
R Swing Programm läuft nur beim Debuggen korrekt ab AWT, Swing, JavaFX & SWT 4
Arif Swing Programm friert ein... AWT, Swing, JavaFX & SWT 2
apple_pie1998 Programm gibt plötzlich exceptions aus. AWT, Swing, JavaFX & SWT 4
N Swing Wie Programm strukturieren? (Dynamisch Komponenten hinzufügen) AWT, Swing, JavaFX & SWT 1
N JLabel ändern während Programm ausgeführt wird AWT, Swing, JavaFX & SWT 4
X JMenu Menu-Bar ausrichtung ändern im Programm AWT, Swing, JavaFX & SWT 0
T Swing Programm hängt sich auf! AWT, Swing, JavaFX & SWT 23
L Probleme mit Programm AWT, Swing, JavaFX & SWT 13
S Grafik: Programm kommt nicht zur paint()-Methode AWT, Swing, JavaFX & SWT 6
P Programm durch Dateiaufruf starten und Datei öffnen AWT, Swing, JavaFX & SWT 2
S Action durchführen beim Programm beenden AWT, Swing, JavaFX & SWT 3
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
G Programm GUI erstellen AWT, Swing, JavaFX & SWT 5
L JButton flackern - Programm hängt sich auf AWT, Swing, JavaFX & SWT 3
T Programm im METRO Design? AWT, Swing, JavaFX & SWT 1
J Programm hängt sich bei Log In auf AWT, Swing, JavaFX & SWT 1
C Programm mit Passwort schließen AWT, Swing, JavaFX & SWT 5
D Robot Programm mit Escape abbrechen (aus Eclipse heraus) AWT, Swing, JavaFX & SWT 2
N Programm läuft perfekt in Eclipse aber nicht in .JAR AWT, Swing, JavaFX & SWT 3
S JScrollPane --> Programm hängt sich beim scrollen auf AWT, Swing, JavaFX & SWT 2
J Programm im GUI ausführen AWT, Swing, JavaFX & SWT 4
A Probleme mit 2 JFrames in einem Programm AWT, Swing, JavaFX & SWT 7
S Event Handling konsole Programm mit Tastendruck beenden AWT, Swing, JavaFX & SWT 5
G JTextArea on the fly aus anderem Programm befüllen AWT, Swing, JavaFX & SWT 4
K Swing Konsolen Programm in GUI - Suche Hilfe bei Konsolenausgabe AWT, Swing, JavaFX & SWT 2
W Windows Fenster in einem Programm AWT, Swing, JavaFX & SWT 2
F Mal Programm AWT, Swing, JavaFX & SWT 13
C In Hauptfenster Programm-Klassen implementieren AWT, Swing, JavaFX & SWT 9
A KeyListener Button wechseln & Programm beenden AWT, Swing, JavaFX & SWT 4
C Swing Wie kann ich im Programm das Menü schließen AWT, Swing, JavaFX & SWT 2
J SWING - Programm ohne Eclipse etc. starten AWT, Swing, JavaFX & SWT 7
J Button soll nach Klick Text ändern und Programm in 3 Sekunden beenden AWT, Swing, JavaFX & SWT 6
M Programm hängt sich auf nachdem repaint() benutzt wurde AWT, Swing, JavaFX & SWT 2
M Programm in Jframe "einbinden" AWT, Swing, JavaFX & SWT 7
S Programm auf aktuellen Stand bringen AWT, Swing, JavaFX & SWT 2
Spin Tool: Popup -Programm AWT, Swing, JavaFX & SWT 3
GUI-Programmer Swing JWindow - Programm wird ohne Grund beendet AWT, Swing, JavaFX & SWT 3
E Kreis-Mal-Programm AWT, Swing, JavaFX & SWT 7
P Programm aktuallisiert sich nur beim Rüberzeigen AWT, Swing, JavaFX & SWT 6
T Java-Anwendung arbeitet Programm in seltsamer Reihenfolge ab AWT, Swing, JavaFX & SWT 3
C Programm für 5 sekunden anhalten und actionevent abfangen AWT, Swing, JavaFX & SWT 18
J Programm schließen AWT, Swing, JavaFX & SWT 4
J Programm nur einmal öffnen AWT, Swing, JavaFX & SWT 3
E Windows Kontext Menü - Laufendes Programm AWT, Swing, JavaFX & SWT 3
T Programm vom Desktop starten! AWT, Swing, JavaFX & SWT 2
S Programm pausieren während JDialog offen ist AWT, Swing, JavaFX & SWT 2
M Browser in Programm einbinden AWT, Swing, JavaFX & SWT 4
R Durch Listener lässt sich Programm nicht mehr ausführen AWT, Swing, JavaFX & SWT 4
H Userinput in GUI an externes Programm AWT, Swing, JavaFX & SWT 8
D Firefox aus Programm starten AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben