MVC

Status
Nicht offen für weitere Antworten.

kzette

Mitglied
Hallo,

ich hänge gerade über dem Design-Pattern und weiß nicht so recht weiter. hier der code:

Code:
package controller;

import java.util.Observable;

import viewer.Gui;

import model.Car;

public class Controller extends Observable {
	private Car car;
	public Controller() {
		Gui gui = new Gui();
		addObserver(gui);
		car = new Car();
	}
	
	public void changeHersteller(){
		
	}
	
	...
		
	}
	public static void main(String[] args) {
		Controller controll = new Controller();
	}
}

Code:
package model;


public class Car {
	private String hersteller; 
	private String modell;
	private String leistung;
	private String baujahr;
	
	public Car() {
		
	}

	public String getBaujahr() {
		return baujahr;
	}
	

	public void setBaujahr(String baujahr) {
		this.baujahr = baujahr;
	}
	

}

Code:
package viewer;

import java.util.Observable;
import java.util.Observer;

import org.eclipse.swt.*;

import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;


public class Gui implements Observer{
	private Shell shell;

	private String textPuffer;

	private Display display;

	private Text besitzer, hersteller, modell, leistung, baujahr;

	private Label lBesitzer, lHersteller, lModell, lLeistung, lBaujahr;

	
	public Gui() {
		display = new Display();
		shell = new Shell(display);
		shell.setText("AutoReparaturVerwaltung by Karsten Zenger");
		// composite = new Composite(shell, SWT.NONE); //Zum Gruppieren nicht
		// direkt auf die Shell
		// Layout-Manager
		GridLayout gridLayout = new GridLayout(3, true);
		shell.setLayout(gridLayout);
		// GridDatas erzeugen
		// GridData von Buttons erzeugen
		GridData ButtonsGridData = new GridData();

		// GridData von TextFeld erzeugen
		GridData textFieldsGridData = new GridData();
		textFieldsGridData.horizontalSpan = 2;
		textFieldsGridData.widthHint = 200;

		// Buttons Erzeugen & Eventbehandlung implementieren

		// Button "sichern" erzeugen
		Button sichern = new Button(shell, SWT.PUSH);
		sichern.setLayoutData(ButtonsGridData);
		sichern.setText("SICHERN");
		sichern.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				control.safe();
			}
		});

		// Button "neu"
		Button neu = new Button(shell, SWT.PUSH);
		neu.setLayoutData(ButtonsGridData);
		neu.setText("Neu");

		// Button "beenden" erzeugen
		Button beenden = new Button(shell, SWT.PUSH);
		beenden.setLayoutData(ButtonsGridData);
		beenden.setText("Beenden");

		// TextFelder & Labels erzeugen
		lHersteller = new Label(shell, SWT.WRAP);
		lHersteller.setText("Hersteller:");

		
		shell.open();
		// Ereignisbearbeitung

		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();

	}


	public void update(Observable arg0, Object arg1) {
		// TODO Auto-generated method stub
		
	}

}


Von der Form her stand dies im FAQ. Ich habe ein Problem mit der Sichtbarkeit. Normalerweise müsste ich doch in der Gui mit controll.changeHersteller() auf den Controller zugreifen . Geht leider nicht, weil die Gui die Controll-Instanz nicht kennt; wie kann ich das ändern?
 

Snape

Bekanntes Mitglied
kzette hat gesagt.:
Ich habe ein Problem mit der Sichtbarkeit. Normalerweise müsste ich doch in der Gui mit controll.changeHersteller() auf den Controller zugreifen.

Mein Verständnis von MVC ist anders. Der Controller sagt der GUI: Dies und jenes ist passiert, hier sind die (aktuellen) Daten, nu zeig schön an. Also m.E. hat der Controller die GUI mit allen notwendigen Informationen zu versorgen.

Geht leider nicht, weil die Gui die Controll-Instanz nicht kennt; wie kann ich das ändern?

S.o.?
 
G

Guest

Gast
Hmm ich möchte nun aber einen Button in der Gui mit einer Funktion belegen. Dazu muss ich doch die Controller-Instanz ansprechen, oder? Kann ich in der Gui aber nicht, die Instanz ist hier unbekannt.

Sprich in der Gui kann ich kein:
controll.safe(); machen

es wäre ja keineswegs sinnvoll,Funktionen wie das speichern in der Gui zu implementieren, ich wollte das eigentlich im Modell machen. Oder irre ich da?
 

jpp

Mitglied
Da hilft etwas Indirektion.

Z.B. könnte im GUI-Package eine Schnittstelle Action mit einer Methode execute definiert sein. Eine Klasse des Controllers könnte diese Schnittstelle dann implementieren.

Dann fehlt nur noch eine Methode addAction in der GUI und voila...
 

Snape

Bekanntes Mitglied
Anonymous hat gesagt.:
Hmm ich möchte nun aber einen Button in der Gui mit einer Funktion belegen. Dazu muss ich doch die Controller-Instanz ansprechen, oder? Kann ich in der Gui aber nicht, die Instanz ist hier unbekannt.

Sprich in der Gui kann ich kein:
controll.safe(); machen

es wäre ja keineswegs sinnvoll,Funktionen wie das speichern in der Gui zu implementieren, ich wollte das eigentlich im Modell machen. Oder irre ich da?

Also wenn ich mir so überlege, was wo gespeichert werden soll, würde ich das schon in der GUI erledigen. Denn die GUI hat ja auch alle notwendigen Daten im Zugriff.
 

kzette

Mitglied
das widerspricht doch aber dem mvc-konzept, die views sollen ja z.b. austauschbar sein ohne dass sich etwas am modell ändert. und ich mag ja das modell speichern.... .
 

Snape

Bekanntes Mitglied
Wenn Dein View etwas am Modell ändern und speichern können soll, ist es kein View mehr. ;)
Also das vorgeschlagene Vorgehen mit den Actions ist da schon korrekt und sauber.
 

kzette

Mitglied
Gibt es denn dazu ein detailliertes Beispiel?? Im FAQ steht das Interface ja z.b. auch im Controller-Package. Ich blick noch nicht so wirklich durch muss ich sagen... .
 
B

bygones

Gast
wieso speichert dein View nicht eine Instanz vom Controller (hab ich ja auch im FAQ Beitrag).

eine gerichtete Assoziation zwischen View und Controller ist sinnvoll und wiederspricht nicht dem MVC
 
Status
Nicht offen für weitere Antworten.

Oben