Model View Controller - Beispielimplementation

Status
Nicht offen für weitere Antworten.

Clip

Bekanntes Mitglied
Hallo,

ich möchte eine Applikation nach dem MVC Prinzip aufbauen. Ich habe mir die Theorie dazu durchgelesen, ich komme allerdings an dem Punkt an den ein Observer ins Spiel kommt nicht mehr weiter. Ich habe versucht mal eine kleine Beispielimplementation zu scheiben um mir selbst das Prinzip zu verdeutlichen. Wie gesagt, ich denke es hapert noch an so manch einer Stelle.
In Dem Beispiel gibt es einen Button und eine Checkbox. Ich möchte, dass wenn der Button gedrückt wird die Checkbox ihren Zustand ändert. Und zwar über das Model, wobei die View im Model nicht bekannt sein soll (deswegen Observer).
Unsicher bin ich mir wie gesagt bei dem Observer kram, und ob ich die Instantierung der Klassen, insbesondere des Controllers richtig gemacht habe.
Ich würde mich freuen wenn mir jemand helfen könnte. Wenn das Beispiel steht wäre es ja evtl. was für die FAQs, da hätte ich zumindest gerne soetwas in der Art gefunden :)

Danke!

Applikation
Code:
package foo.MVC;

public class MyApplication {

	public static void main(String[] args) {
		MyModel model = new MyModel();
		MyView view = new MyView(model);
		view.setVisible(true);
	}
}

View:
Code:
package foo.MVC;

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JButton;
import javax.swing.JCheckBox;

public class MyView extends JFrame implements Observer{

	private JPanel jPanel = null;
	public JButton jButton = null;
	public JCheckBox jCheckBox = null;
	private MyController controller;
	

	public MyView(MyModel model) {
		super();
		controller = new MyController(this, model);
		initialize();
	}

	private void initialize() {
		this.setSize(219, 128);
		this.setContentPane(getJPanel());
		this.setTitle("Titel");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
	}

	private JPanel getJPanel() {
		if (jPanel == null) {
			jPanel = new JPanel();
			jPanel.setLayout(new BorderLayout());
			jPanel.add(getJButton(), java.awt.BorderLayout.CENTER);
			jPanel.add(getJCheckBox(), java.awt.BorderLayout.SOUTH);
		}
		return jPanel;
	}

	private JButton getJButton() {
		if (jButton == null) {
			jButton = new JButton();
			jButton.setText("OK");
			jButton.addActionListener(controller);
			
		}
		return jButton;
	}

	private JCheckBox getJCheckBox() {
		if (jCheckBox == null) {
			jCheckBox = new JCheckBox();
		}
		return jCheckBox;
	}

	public void update(Observable arg0, Object arg1) {
		///??? was genau soll hire hin ???		
	}

}  //  @jve:decl-index=0:visual-constraint="10,10"

Model:
Code:
package foo.MVC;

import java.util.Observable;

public class MyModel extends Observable{	
	boolean myValue = true;
	
	public MyModel(){
		// hier sollte im View die Checkbox gemäß myValue eingestellt werden
	}
	
	public void setMyValue(boolean myValue){
		this.myValue = myValue;
		// hier sollte im View die Checkbox gemäß myValue eingestellt werden
		// notifyObservers(???);
	}	
	
	public boolean getMyValue(){
		return myValue;
	}
}

Controller:
Code:
package foo.MVC;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MyController implements ActionListener{
	private MyView view = null;
	private MyModel model = null;

	public MyController(MyView view, MyModel model ){
		this.view = view;
		this.model = model;
	}
	
	public void actionPerformed(ActionEvent e) {
	    Object which = e.getSource();
	    if (which == view.jButton) {
	    	model.setMyValue(!model.getMyValue());
		}
    }		
}
 

Clip

Bekanntes Mitglied
ohh :oops:

Der Vollständigkeit halber die Klassen nach der Vorlage aus den FAQs:

Applikation:
Code:
package foo.MVC;

public class MyApplication {

	public static void main(String[] args) {
		MyController controller = new MyController();		
	}
}

View:
Code:
package foo.MVC;

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JButton;
import javax.swing.JCheckBox;

public class MyView extends JFrame implements Observer{

	private JPanel jPanel = null;
	public JButton jButton = null;
	public JCheckBox jCheckBox = null;
	private MyController controller;
	

	public MyView(MyController controller) {
		super("WindoController");
		this.controller = controller;
		initialize();
		this.setVisible(true);
	}

	private void initialize() {
		this.setSize(219, 128);
		this.setContentPane(getJPanel());
		this.setTitle("Titel");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
	}

	private JPanel getJPanel() {
		if (jPanel == null) {
			jPanel = new JPanel();
			jPanel.setLayout(new BorderLayout());
			jPanel.add(getJButton(), java.awt.BorderLayout.CENTER);
			jPanel.add(getJCheckBox(), java.awt.BorderLayout.SOUTH);
		}
		return jPanel;
	}

	private JButton getJButton() {
		if (jButton == null) {
			jButton = new JButton();
			jButton.setText("OK");
			jButton.addActionListener(controller);			
		}
		return jButton;
	}

	private JCheckBox getJCheckBox() {
		if (jCheckBox == null) {
			jCheckBox = new JCheckBox();
			jCheckBox.setSelected(true);
		}
		return jCheckBox;
	}

	public void update(Observable arg0, Object arg1) {
		MyModel model = (MyModel) arg1;
		jCheckBox.setSelected(model.getMyValue());
	}

}  //  @jve:decl-index=0:visual-constraint="10,10"

Model:
Code:
package foo.MVC;


public class MyModel {	
	boolean myValue = true;
	
	public void setMyValue(boolean myValue){
		this.myValue = myValue;
	}	
	
	public boolean getMyValue(){
		return myValue;
	}
}

Controll:
Code:
package foo.MVC;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;

public class MyController extends Observable implements ActionListener {
	private MyView view = null;
	private MyModel model = null;

	public MyController(){
		view = new MyView(this);
		model = new MyModel();
		addObserver(view);
	}
	
	public void actionPerformed(ActionEvent e) {
	    Object which = e.getSource();
	    if (which == view.jButton) {
	    	model.setMyValue(!model.getMyValue());
	    	setChanged(); 
	    	notifyObservers(model); 
		}
    }		
}
 

Jörg

Bekanntes Mitglied
view:
Code:
   public void update(Observable arg0, Object arg1) { 
      ///??? was genau soll hire hin ???       
      // so etwas:
      boolean value = model.getValue(); // oder:
      boolean value = (ModelValue) arg1;
      checkbox.setValue(value); //bzw.
      checkbox.setSelected(value);
   }

model:
Code:
   public MyModel(){ 
      // hier sollte im View die Checkbox gemäß myValue eingestellt werden 
      // noe
   } 
    
   public void setMyValue(boolean myValue){ 
      this.myValue = myValue; 
      // hier sollte im View die Checkbox gemäß myValue eingestellt werden 
      // genau:
      notifyObservers(myValue); 
      // macht das ueber die update() methode ... 
   }
 

Clip

Bekanntes Mitglied
Danke Jörg.
Eine Frage zu Deinem Code.
In Deiner Ausführung führst Du die Methode "notifyObservers()" im Model aus. Ist es nicht besser dies im Controller zu tun um eine bessere Trennung zwischen View und Model zu haben?
Und in Deinem View tust Du folgendes:
Code:
      boolean value = model.getValue(); // oder:
      boolean value = (ModelValue) arg1;
Woher kennt die View Schicht denn das Model? Dan muss das Model doch als Referenz im View bekannt sein, oder?
Wie kann ich mit Deiner Methode im View un der Funktion "update" unterscheiden welcher Wert geupdatet wurde?
:?:
 

Jörg

Bekanntes Mitglied
tja also da gibt es jetzt (IMHO) verschiedene Ansaetze.
Im eigentlichen MVC weiss erstmal nur das Model vom View
nichts. Du kannst die beiden noch mehr voneinander trennen,
aber irgendwann kommst du deinem Ziel nicht mehr hinterher...

notifyObservers() in den Controller legen
ist zb noch ne gute Idee, aber nicht wirklich noetig, wenn du
nur eine dedizierte Applikation bauen willst.

Woher kennt die View Schicht denn das Model?
Wie oben gesagt, kann das schon der Fall sein, schliesslich
soll der View ja die Daten des Models repraesentieren. Natuerlich
kannst das alles auch in den Controller legen.

Das war halt meine Loesung und dazu kannst du dann das arg1
als ValueObject realisieren, welches den Namen der Property
haelt, sowie den alten und neuen Wert...

Kuck dir vielleicht auch mal den PropertyChangeSupport an!
Evtl interessieren dich auch die slides zum binding auf jgoodies.com
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Saubere Trennung Model, View, Controller Javafx AWT, Swing, JavaFX & SWT 10
ralfb1105 JavaFX Exception Message von Model Class via Controller in View darstellen AWT, Swing, JavaFX & SWT 39
R Model View Controller Konzept AWT, Swing, JavaFX & SWT 2
M SWT und Model View Controller? AWT, Swing, JavaFX & SWT 8
O Swing JTextField Sync View -> Model AWT, Swing, JavaFX & SWT 3
R Swing Designfrage - Zusammenspiel Model / View AWT, Swing, JavaFX & SWT 10
J Swing SwingActions und das Problem auf den View bzw. das Model zuzugreifen AWT, Swing, JavaFX & SWT 2
D Swing JTable Model View Problem AWT, Swing, JavaFX & SWT 6
M Swing Model an View binden AWT, Swing, JavaFX & SWT 4
K JSpinner - Model <-> View, unterschiedliche Werte AWT, Swing, JavaFX & SWT 9
B View zeichnet Daten aus dem Model ohne Update AWT, Swing, JavaFX & SWT 4
C Default table model aktualisieren AWT, Swing, JavaFX & SWT 7
A ViewController (IFrame) > Jdialog > Model AWT, Swing, JavaFX & SWT 1
F JComboBox und Model AWT, Swing, JavaFX & SWT 10
S UI Model Binding AWT, Swing, JavaFX & SWT 7
F jTree und das Model aus einer eigenen Klasse AWT, Swing, JavaFX & SWT 1
ralfb1105 JavaFX MVC: Thread in Model Class mit Ausgabe in TextArea AWT, Swing, JavaFX & SWT 10
B JavaFX mvvmfx - Model AWT, Swing, JavaFX & SWT 3
J JavaFX - mehrere Views, Model durchreichen AWT, Swing, JavaFX & SWT 10
T JavaFX Model Daten übergeben AWT, Swing, JavaFX & SWT 4
S Zwei JTree, ein Model, bei Selection im ersten JTree soll der zweite die Inhlate anzeigen AWT, Swing, JavaFX & SWT 2
M JList Model filtern AWT, Swing, JavaFX & SWT 4
S Swing Tabelle mit Model bei eingeschaltetem Filter synchronisieren AWT, Swing, JavaFX & SWT 6
P jTable model setzen AWT, Swing, JavaFX & SWT 6
D SWT TreeViewer: Daten aus Model gelöscht... trotzdem noch im Baum AWT, Swing, JavaFX & SWT 4
F Swing GUI und Model mit Timer AWT, Swing, JavaFX & SWT 13
earlgrey_tea JTextfield Model AWT, Swing, JavaFX & SWT 14
L Swing Model für ComboBox AWT, Swing, JavaFX & SWT 14
O Swing JTable - Zeilen färben (mit Model) AWT, Swing, JavaFX & SWT 13
C Swing JTable verbindet sich nicht mit Model AWT, Swing, JavaFX & SWT 20
D Swing JList <-> AdapterModel <-> Model AWT, Swing, JavaFX & SWT 4
C Swing MVC Verbindung von Model und Db AWT, Swing, JavaFX & SWT 23
N update model nach dem filtern AWT, Swing, JavaFX & SWT 2
D Swing JList, CellRenderer und Model AWT, Swing, JavaFX & SWT 6
K Swing JTable Model aktualisieren AWT, Swing, JavaFX & SWT 2
C Swing JComboBox probleme bei Set Model AWT, Swing, JavaFX & SWT 5
T JTable Model AWT, Swing, JavaFX & SWT 5
F unspezifizierte Frage zu JTable/ Model AWT, Swing, JavaFX & SWT 6
D ComboBox-Model mit Observer AWT, Swing, JavaFX & SWT 3
R Zugriff auf Model im MVC-Design aus SwingWorker heraus AWT, Swing, JavaFX & SWT 3
Z JLIST / Model erster EINTRAG AWT, Swing, JavaFX & SWT 11
G Model,Listener und background jobs AWT, Swing, JavaFX & SWT 4
X Swing JList -> Daten anders darstellen als im Model hinterlegt -> möglich ? AWT, Swing, JavaFX & SWT 9
N Model Aktualisieren AWT, Swing, JavaFX & SWT 4
N Swing JComboBox: Auf Model- und Selectionänderungen reagieren AWT, Swing, JavaFX & SWT 2
D JTable, Model, Fokus AWT, Swing, JavaFX & SWT 3
hdi Swing JTable: Löschen vom Daten im Model AWT, Swing, JavaFX & SWT 7
R Swing alle Frames nutzen das gleiche Model AWT, Swing, JavaFX & SWT 2
S JList mit Vector als Model? AWT, Swing, JavaFX & SWT 12
S JTree mit Daten aus Model füllen, eigenes TreeModel (gute Dokumentation des Problems) AWT, Swing, JavaFX & SWT 2
J JTable Model laesst sich nicht serialisieren? AWT, Swing, JavaFX & SWT 16
D ComboBox(Model) mit dummyItem AWT, Swing, JavaFX & SWT 10
G JComboBox mit eigenem Model vorhanden, wie selektieren AWT, Swing, JavaFX & SWT 29
M MVC: Grundidee verstanden aber was machen mit mehreren Model AWT, Swing, JavaFX & SWT 2
V JList ist leer -Model ist voll. Ja, ne is klaaa. AWT, Swing, JavaFX & SWT 8
W Suche großes vollständiges Swing GUI Beispiel nach MVC Model AWT, Swing, JavaFX & SWT 5
P jTable mit Model lässt sich nicht neu laden AWT, Swing, JavaFX & SWT 5
P JTable/Model füllen mit Fortschrittsbalken, Var. Rückgabetyp AWT, Swing, JavaFX & SWT 2
J model von jcombobox AWT, Swing, JavaFX & SWT 4
D Swing und MVC und doppeltes Model? AWT, Swing, JavaFX & SWT 5
G JTable und Model AWT, Swing, JavaFX & SWT 21
J JTable / Model Daten verändern AWT, Swing, JavaFX & SWT 5
C [JTable] ArrayIndexOutOfBoundsException im Model AWT, Swing, JavaFX & SWT 8
Icewind Jlist zeigt neue elemente im model nicht sofort an AWT, Swing, JavaFX & SWT 3
Icewind JTable zeigt neue elemente im model nicht sofort an AWT, Swing, JavaFX & SWT 3
G Neues Model für JTextField erstellen AWT, Swing, JavaFX & SWT 8
A Gemeinsames Model für Baum- und Graphdarstellung-wie gehts? AWT, Swing, JavaFX & SWT 9
S Frage zu Table(Column)Model AWT, Swing, JavaFX & SWT 3
H Model umbauen ? AWT, Swing, JavaFX & SWT 5
J Table Model AWT, Swing, JavaFX & SWT 2
J Abstract Table Model AWT, Swing, JavaFX & SWT 7
D Model Listener beim JTree AWT, Swing, JavaFX & SWT 5
S JavaFX Fehler zwischen View und Controller bei MouseEvent (MVC) AWT, Swing, JavaFX & SWT 13
J Java FX NullPointerException, ObservableList wird in View nicht angezeigt.. AWT, Swing, JavaFX & SWT 34
H 3 verschiedene Nachrichten in einer FXML View die Infos kommen aus DB AWT, Swing, JavaFX & SWT 4
S JavaFX Boolean ändern Table View AWT, Swing, JavaFX & SWT 14
M Swing MVC-Pattern - View mit mehreren Models AWT, Swing, JavaFX & SWT 5
M JavaFX - Array in View auslesen AWT, Swing, JavaFX & SWT 12
4a61766120617274697374 dynamische Tree View AWT, Swing, JavaFX & SWT 2
H JavaFX Ein View vorschalten Exception AWT, Swing, JavaFX & SWT 7
M SWT View nicht mehr sichtbar AWT, Swing, JavaFX & SWT 2
G JavaFX "Framework" zur View Ersellung AWT, Swing, JavaFX & SWT 0
M JavaFX Image View Würfel berechnen AWT, Swing, JavaFX & SWT 3
K Panels mit eigenen Controllern in Main-View einbauen AWT, Swing, JavaFX & SWT 4
T View AccessibleContext AWT, Swing, JavaFX & SWT 0
S Swing Auf Änderungen eines Models in der View einer JTable reagieren AWT, Swing, JavaFX & SWT 1
S Swing JPanel in View ersetzen AWT, Swing, JavaFX & SWT 10
S View-Komponenten im Controller bekannt machen AWT, Swing, JavaFX & SWT 7
L View aus dem MVC ist immer die GUI? AWT, Swing, JavaFX & SWT 5
Nicklas2751 Table View zeigt keinen Inhalt nur leere Zeilen AWT, Swing, JavaFX & SWT 2
Rudolf Swing Baut die View die Modelebene auf oder wer? AWT, Swing, JavaFX & SWT 13
G Swing MVC / View - Controller AWT, Swing, JavaFX & SWT 7
N MVC - Logik zum Verändern der View AWT, Swing, JavaFX & SWT 8
V Eclipse View Right-Click Menu hinzufügen AWT, Swing, JavaFX & SWT 2
D Drag-Action: Innerhalb meiner View? AWT, Swing, JavaFX & SWT 3
C SWT-Elemente an View-Fenster angleichen und automatisch resizen AWT, Swing, JavaFX & SWT 3
G Swing Höhe des View eines JScrollPane fest auf Höhe des JScrollPane setzen! AWT, Swing, JavaFX & SWT 4
H shell in view implementieren; menu mit keystroke unterlegen AWT, Swing, JavaFX & SWT 8
M Swing Von einem Controller aus View-Elemente ändern AWT, Swing, JavaFX & SWT 11
H Swing JScrollPane mit JPanel als View AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben