# Listener vs. Observer im MVC-Prinzip



## haudek (30. Oktober 2008)

Hallo zusammen, 

nun wage ich es doch zu fragen. Ich habe schon ein paar Threads zum Thema "Observer" hier gelesen, aber ich komme bei mir nicht weiter. Kann mir einer einen guten Tipp geben

Folgendes:
Ich habe eine (Haupt-) GUI mit mehreren Tabfoldern, wo verschiedene Daten dargestellt werden und manche änderbar sein sollen. Alle Daten lese ich aus einer DB aus und zeige sie an. Soweit bin ich jetzt. 
Nun möchte ich in den Text-Feldern die Daten ändern. Wenn das geschieht soll in meiner Statuszeile quasi ein  Ampel (Speicher)-symbol erscheinen, der anzeigt, dass ich speichern (und in die DB zurückschreibe) soll, bevor ich den Datensatz wieder verlasse. 

Kann man da sagen, was geschickter ist: Listener oder Observer Alternative?
Bin ich auf dem richtigen Weg?

Folgende Listener Alternative habe ich bereits. Ich rufe mit dem Listener des Textfelds das Model für den Änderungsflag auf. Und solange  nicht gespeichert ist, kann ich kein neuen Datensatz wählen. (Kundentabelle im HauptGUI)  

Wie würde ich das mit Observer machen. Ich bekomme das mit den Observern nicht hin!!  Ich stehe echt auf dem Schlauch.Was ist am sinnvollsten?   


Aufruf der HauptGUI: (Control)

```
public class HauptGUIController implements EventListener{

	public HauptGUIController (ArrayList<ComboboxKundenModell> kundenliste){
		Display display = Display.getDefault();
		
		HauptGUI applikation = new HauptGUI(kundenliste);
		applikation.sShell.open();
		
		/*Warten bis Hauptfenster geschlossen wird*/
		while (!applikation.sShell.isDisposed()) {
			//Prüfen, ob Ereignisse warten
			if (!display.readAndDispatch())  display.sleep();
		}
		display.dispose();

	}
........
```


HauptGUI: (View) - Ein Auszug davon

```
public class HauptGUI{
	private ArrayList<ComboboxKundenModell> kundenliste; 
....
	public HauptGUI (ArrayList<ComboboxKundenModell> _kundenliste){
		this.kundenliste = _kundenliste;
/* Methode für GUI*/
		createSShell();
		kundenComboFuellen(kundenliste);
	}
........
	private void createAdresse_group() {
/*    z.B. ersten Textfeld mit Listener überwachen */
	Name1Text = new Text(Adresse_group, SWT.BORDER);
	Name1Text.setLayoutData(gridData21);
	Name1Text.addKeyListener(new org.eclipse.swt.events.KeyAdapter() {
		public void keyPressed(org.eclipse.swt.events.KeyEvent e) {
			ChangeFlag.setChangeFlag();    //Setze flag im ChangeModel
			zeigeStatusleiste(); // Anzeige der entsprechenden Ampel
		}
	});
        .....
	}
.....
	private void createAuswahlGroup() {
.........
	        kundenSuche = new Table(AuswahlGroup, SWT.FULL_SELECTION);
		kundenSuche.setHeaderVisible(true);
		kundenSuche.setFont(new Font(Display.getDefault(), "Segoe UI", 8, SWT.NORMAL));
		kundenSuche.setLayoutData(gridData183);
		kundenSuche.setLinesVisible(true);
		kundenSuche.addMouseListener(new org.eclipse.swt.events.MouseAdapter() {
			public void mouseDoubleClick(org.eclipse.swt.events.MouseEvent e) {
				if (ChangeFlag.getFlag()== false){
				anzeigeKundeIndex = kundenSuche.getSelectionIndex();
				datenAnzeigeSteuerung();}
				else{
					System.out.println("nicht gespeicherte Daten vorhanden");
				}
			}
		});
...........
        }

.......
/*Methode zum Anzeigen der Statuszeile */
	private void zeigeStatusleiste(){
		if (ChangeFlag.getFlag()){
/*   Label zeigen wenn Daten geändert, aber nicht gespeichert sind*/

			Status3.setVisible(true); 
		}
		else{
/*  Label nicht zeigen wenn Daten geändert, da gespeichert wurde */
			Status3.setVisible(false);
		}
	}
.......
.......
/*Button für das Speichern*/ 
	private void createToolBar() {
		toolBar = new ToolBar(sShell, SWT.FLAT | SWT.RIGHT);
		ToolItem toolItem1Save = new ToolItem(toolBar, SWT.PUSH);
		toolItem1Save.setToolTipText("Speichern (in DB)");
		toolItem1Save.setText("Speichern");
		
	toolItem1Save.addSelectionListener(new org.eclipse.swt.events.SelectionListener() {
	public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
						ChangeFlag.setSaveFlag();
						zeigeStatusleiste();}
/* hier kommt noch mehtodenaufrruf zum schreiben in die DB */
	public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
	}
	});
```

KLasse für Änderungsflag: (Modell)

```
package roadman.model;

import roadman.gui.HauptGUI;

public class ChangeFlag {

	private static ChangeFlag flag = null;
	
	private static boolean StammdatenFlag = false;
	
	public ChangeFlag(){
	// noch leer
	}
	
	public static void setChangeFlag (){
		StammdatenFlag = true;
	}
	
	public static void setSaveFlag (){
		StammdatenFlag = false;
	}
	
	public static boolean getFlag (){
		return StammdatenFlag;
	}
}
```


----------

