Einfache MVC-Uhr. MVC richtig umgesetzt? [Überarbeitet]

Status
Nicht offen für weitere Antworten.

razor

Mitglied
Hallo All,

das wird mein erster Beitrag hier im Forum.
Habe noch nicht viel Erfahrung mit Java, bis jetzt nur ein paar kleine Programme geschrieben.
Ich befasse mich zur Zeit mit Entwurfmustern und wollte mein kleines MVC Programm mal zur Einsicht hier reinstellen.
Habe mir bereits viele Beispiele im Netz angeschaut und versucht sie nachzuvollziehen.
Meine Frage wäre, ob ich ModellViewController richtig "verstanden" habe?
Vielleicht gibt es etwas zu verbessern.

Das Programm an sich läuft, mir geht es Hauptsächlich ums MVC Paradigma, aber falls es auch Verbesserungsvorschläge bzgl. Code gibt, immer her damit.

Vielen Dank in vorraus!

PS:
war mir nicht sicher, ob es vielleicht doch in den OOP Bereich gehört, falls ja Bitte verschieben.

MainKlasse
Code:
package pckg;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Toolkit;
import javax.swing.JFrame;

public class TimeMain 
{

	public static void main(String[] args)
	{
		TimeModel model = new TimeModel();
		TimeView view = new TimeView(model);
		TimeController controller = new TimeController(model, view);

		init(view, controller);
	}
	/**
	 * Init erzeugt ein Frame und belegt es mit der Ausgabekomponente und Kontrollkomponente
	 * @param view = Ausgabekomponente
	 * @param controller = Kontrollkomponente
	 */
	public static void init(Component view, Component controller)
	{
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setBounds(200, 200, 300, 100);
		CentrFrame(frame);
		frame.setVisible(true);
		frame.getContentPane().add(view, BorderLayout.CENTER);
		frame.getContentPane().add(controller, BorderLayout.SOUTH);
	}
	/**
	 * Zentrierung des Fensters
	 * @param f = Frame (Fenster, das zentriert werden soll)
	 */
	public static void CentrFrame(JFrame f)
	{
		double height=Toolkit.getDefaultToolkit().getScreenSize().height;
		double width=Toolkit.getDefaultToolkit().getScreenSize().width;
		f.setBounds( (int)width/2-f.getWidth()/2,(int)height/2-f.getHeight()/2, f.getWidth(),f.getHeight());
	}
}


ModellKlasse
Code:
package pckg;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Observable;
import java.util.Timer;


public class TimeModel extends Observable 
{
	private String time = new String();
	private boolean tick;
	private Timer timer = new Timer();

	public TimeModel() 
	{
		DateFormat formatter = new SimpleDateFormat("HH.mm.ss / dd.MM.yyyy");
		this.time = formatter.format(new Date());
		this.tick=false;
	}
	/**
	 * Zeit setzen (wird erst mal nicht gebraucht)
	 * @param s
	 */
	public void setTime(String s)
	{
		this.time =s;
		setChanged();
		notifyObservers();
	}
	/**
	 * Zeit ausgeben (wird erst mal nicht gebraucht)
	 * @return
	 */
	public String getTime()
	{
		return time;
	}
	/**
	 * Zeit vom System hollen
	 *
	 */
	public void updateTime()
	{
		DateFormat formatter = new SimpleDateFormat("HH.mm.ss / dd.MM.yyyy");
		this.time = formatter.format(new Date());
		setChanged();
		notifyObservers();
	}
	/**
	 * Aktualisierung der Zeit (on/off)
	 * mit Hilfe der TimeTick KLasse wird die Zeit in TimeModel 
	 * mit der Systemzeit synchronisiert (Interval 1sek)
	 *
	 */
	public void tickTime()
	{
		if(!tick)
		{
			this.tick=true;
			Timer t = new Timer();
			t.schedule(new TimeTick(this), 0, 1000);
			this.timer=t;
		}
		else 
		{
			this.tick=false;
			timer.cancel();
		}
	}
}

TimeTick Klasse (Wird von der TimeModell KLasse benötigt)
Code:
package pckg;

import java.util.TimerTask;

public class TimeTick extends TimerTask
{
	private TimeModel model = new TimeModel();
	
	public void run() 
	{
		model.updateTime();
	}
	public TimeTick(TimeModel m)
	{
		this.model = m;
	}
}

ViewKlasse
Code:
package pckg;

import java.awt.Color;
import java.awt.Font;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class TimeView extends JPanel implements Observer
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 830996912263397813L;
	private JLabel label = new JLabel();
	private TimeModel model = new TimeModel();
	
	/**
	 * Erzeugt eine Ausgabekomponente der Klasse JPanel mit einem Label in der Mitte
	 * @param m = das Modell
	 */
	public TimeView(final TimeModel m)
	{
		super();
		this.model = m;

		label.setHorizontalAlignment(JLabel.CENTER);		
		label.setForeground(Color.BLUE);
		label.setFont(new Font("Georgia", 1, 18));
		
		this.add(label);
	}
	/**
	 * Updatemethode
	 */
	public void update(Observable obs, Object obj) 
	{
		label.setText(model.getTime());
	}
}

ControllerKlasse
Code:
package pckg;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;

public class TimeController extends JPanel 
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 5216809802813019642L;
	private JButton button = new JButton("Start / Stop");
	
	/**
	 * Kontroller
	 * @param model = das Modell
	 * @param view = die Ausgabekomponente
	 */
	public TimeController(final TimeModel model, final TimeView view)
	{
		super();
		// Layout setzten und Button einfügen
		this.setLayout(new BorderLayout());
		this.add(button, BorderLayout.CENTER);
		
		// Observer registrieren
		model.addObserver(view);
		
		// ButtonListener erzeugen
		button.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				// Starte oder Stoppe die System-Zeitanzeige
				model.tickTime();
			}
		});
	}
}
 

HLX

Top Contributor
Ich habe bislang noch nicht mit dem Observer-Pattern gearbeitet. Ich sehe nur das eine enge Bindung zwischen Model und View besteht. Dein Model kennt deine View und die View das Model. Von daher bin ich mir nicht sicher, ob man das noch im Sinne von MVC getrennt ansehen kann.

2 Dinge würde ich ändern:
1.) die Main-Methode von GUI-Einstellungen befreien:
Code:
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setBounds(200, 200, 300, 100); 
      CentrFrame(frame); 
      frame.setVisible(true); 
      frame.getContentPane().add(view, BorderLayout.CENTER); 
      frame.getContentPane().add(controller, BorderLayout.SOUTH);
Das alles in den Konstruktor oder in eine Initialisierungsmethode von deinem Frame.

2.) Den Kontroller nicht von einem Panel sondern von einem Listener ableiten. Der Listener ist in deinem Falle der eigentliche Controller.
 

razor

Mitglied
@ HLX
Vielen Dank für deine schnelle Antwort.
ZU den Observer, habe gestern irgendwo gelesen, dass man bei Java mit Observer eine Art eigenes (vereinfachtes) MVC Konzept hat. Der unterscheidet sich darin, dass sie Viewer und Controller zusammenlegen !? Sprich, falls ich MVC richtig umsetzten will muss ich wohl auf Interfaces ? umsteigen.

Pkt 1) den Frame und die Parameter verlege ich die TimeView Klasse, oder vielleicht doch in eine eigene KLasse.

Pkt 2) ok
 

razor

Mitglied
Mein zweiter Versuch:

Ich hoffe jemand hat etwas Zeit um es sich anzugucken, ich habe es möglichst einfach programmiert und es ist nicht soviel wie auf dem ersten Blick ausschaut.
Ich will wieder wissen ob ich MVC Prinzip umgesetzt habe.

TimeModell hat einen String time, dieses wird jede Sekunde an die Systemzeit angepasst, aktualisiert.
TimeView hat zwei Componenten JLabel (zur Ausgabe der Zeit) und JButton (damit Starte und Stoppe ich die Zeitanzeige durch den Label).
TimeController verwaltet View und Model.

Verbesserungen oder Vorschläge ?

THX in vorraus!



Main-Klasse
Code:
public class TimeMainTwo {
	public static void main(String[] args) {
		TimeModel tmodel = new TimeModel();
		TimeView tview = new TimeView();
		TimeController ctrl = new TimeController(tmodel,tview);
		tmodel.timeTick();
	}
}


Model-Klasse

Code:
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Observable;
import java.util.Timer;




public class TimeModel extends Observable {
	
	public String time;	
	
	public void setTime(String t){
		time= t;
		setChanged();
		notifyObservers();
	}
	
	public String getTime(){
		return time;
	}

	public void timeTick(){
		Timer t = new Timer();
		t.schedule(new TimeTick(this), 0, 1000);
	}
	public void updateTime(){
		DateFormat formatter = new SimpleDateFormat("HH.mm.ss / dd.MM.yyyy");
		setTime(formatter.format(new Date()));
	}

}

TimeTick-Klasse (benötigt von TimeModel)

Code:
import java.util.TimerTask;


public class TimeTick extends TimerTask
{
	private TimeModel model = new TimeModel();
	
	public void run() 
	{
		model.updateTime();
	}
	public TimeTick(TimeModel m)
	{
		this.model = m;
	}
}


Viewer-Klasse

Code:
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class TimeView extends JFrame{

	/**
	 * 
	 */
	private static final long serialVersionUID = -2910645591812558004L;
	private JLabel label = new JLabel("Klicken Sie auf Start");
	private JButton button = new JButton("Start / Stop");

	
	public TimeView(){
		super();
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setBounds(200, 200, 300, 150);
		this.setVisible(true);
		this.getContentPane().add(label, BorderLayout.CENTER);
		this.getContentPane().add(button, BorderLayout.SOUTH);
		label.setHorizontalAlignment(JLabel.CENTER);
	}
	public void setActionListener(TimeController ctrl){
		button.addActionListener(ctrl);
	}
	public void unsetActionListener(TimeController ctrl){
		button.removeActionListener(ctrl);
	}
	public void setOutput(String s){
		label.setText(s);
	}
}


Controller-Klasse

Code:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;


public class TimeController implements ActionListener, Observer 
{
	private TimeView tview;
	private TimeModel tmodel;
	
	public TimeController(TimeModel model, TimeView view){
		
		this.tmodel=model;
		this.tview=view;
		
		view.setActionListener(this);		
	}

	public void actionPerformed(ActionEvent arg0) {
		if (tmodel.countObservers()==1) 
			tmodel.deleteObservers();
		else 
			tmodel.addObserver(this);
	}

	public void update(Observable arg0, Object arg1) {
		tview.setOutput(tmodel.getTime());
	}
}
 

HLX

Top Contributor
Gefällt mir auf den ersten Blick sehr gut. Schöne MVC Implementierung.

Eine kleinigkeit würde ich noch verändern:
Code:
public void setActionListener(ActionListener al){ 
      button.addActionListener(al); 
   } 
   public void unsetActionListener(ActionListener al){ 
      button.removeActionListener(al); 
   }
Damit bist du flexibler.
 

razor

Mitglied
HLX hat gesagt.:
Gefällt mir auf den ersten Blick sehr gut. Schöne MVC Implementierung.

Eine kleinigkeit würde ich noch verändern:
Code:
public void setActionListener(ActionListener al){ 
      button.addActionListener(al); 
   } 
   public void unsetActionListener(ActionListener al){ 
      button.removeActionListener(al); 
   }
Damit bist du flexibler.

Vielen Dank!

Die Änderung macht es natürlich deutlich flexibler.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
monsterherz einfache Methode mit Fehler den ich nicht finde Java Basics - Anfänger-Themen 21
I Erste Schritte Einfache Datenbank-Webseite erstellen als Nicht-IT-lerin Java Basics - Anfänger-Themen 24
B Einfache OCR zur Zahlenerkennung? Java Basics - Anfänger-Themen 6
M Einfache Datenfilterung Java Basics - Anfänger-Themen 15
D Beim Programmieren auf die Logisch einfache Lösung kommen. Java Basics - Anfänger-Themen 17
H Einfache Frage zur Punktnotation objektname.methode(wert) Java Basics - Anfänger-Themen 2
B Einfache HSQLDB? (lock acquisition failure) Java Basics - Anfänger-Themen 2
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
O Ganz einfache Frage - Array Java Basics - Anfänger-Themen 5
E Einfache Java Verschlüsselung Java Basics - Anfänger-Themen 4
J Einfache Frage zu "null" Java Basics - Anfänger-Themen 2
J Einfache pub/sub Lösung mit ausführlicher Doku Java Basics - Anfänger-Themen 5
R Gibt es Eine einfache Programierung dieser Methoden Java Basics - Anfänger-Themen 8
K einfache Kombinatorik Java Basics - Anfänger-Themen 4
M Erste Schritte Einfache Aufzugssteuerung programmieren - Anfänger Java Basics - Anfänger-Themen 2
D Eine einfache Verschlüsselung schreiben Java Basics - Anfänger-Themen 3
B in einem abstrakten Set ,Elemente einer einfache verkettete List epeichern Java Basics - Anfänger-Themen 13
X Einfache Frage; wie soll ich die spezielle float var speichern? Java Basics - Anfänger-Themen 2
J Einfache einbindung eines Bildes in ein Applet Java Basics - Anfänger-Themen 4
D Klassen Gesucht: Einfache Beispiel-Klasse für einen Datentyp Java Basics - Anfänger-Themen 7
K Möglichkeiten um eine einfache Animation darzustellen Java Basics - Anfänger-Themen 7
L Einfache Lineare Suche Java Basics - Anfänger-Themen 7
P Erste Schritte Einfache For Schleife Java Basics - Anfänger-Themen 10
M Einfache Java Operation, cheggs net Java Basics - Anfänger-Themen 2
V Erste Schritte Einfache Rechnung mit Exponenten Java Basics - Anfänger-Themen 3
G einfache Leet-Übersetzung implementieren und benutzen Java Basics - Anfänger-Themen 14
M Einfache und Doppelte Operatoren Java Basics - Anfänger-Themen 3
E Einfache For-Schleife macht nicht was sie soll Java Basics - Anfänger-Themen 2
shiroX OOP Türme von Hanoi - einfache grafische Ausgabe Java Basics - Anfänger-Themen 2
C Extrem einfache Aufgabe falsch beantwortet :$ Java Basics - Anfänger-Themen 6
Z Super einfache Frage For-Schleife im Detail Java Basics - Anfänger-Themen 3
N Potenzierung durch einfache Operatoren Java Basics - Anfänger-Themen 13
H Einfacher Editor, Einfache Handelsanweisungen Java Basics - Anfänger-Themen 2
H Sehr einfache Java-Programme Java Basics - Anfänger-Themen 24
H Einfache Client/Server-Kommunikation Java Basics - Anfänger-Themen 16
-horn- Einfache graphische Darstellung von 3D Koordinaten für Flugbahnen? Java Basics - Anfänger-Themen 4
B Einfache jsp Seite darstellen Java Basics - Anfänger-Themen 9
G Einfache if-Abfrage der Main-Argumente Java Basics - Anfänger-Themen 3
J Einfache Designfrage Java Basics - Anfänger-Themen 4
R Methoden Einfache Loops? Java Basics - Anfänger-Themen 8
E einfache Frage zu private Java Basics - Anfänger-Themen 26
R Sehr einfache möglichkeit ArrayList oder Array zu initialisieren? Java Basics - Anfänger-Themen 8
F Einfache Klassen für Datum und Zeit Java Basics - Anfänger-Themen 3
Spin Einfache Anfänger Frage setVisible von Panels Java Basics - Anfänger-Themen 5
E OOP einfache Array Aufgabe mit jUnit Java Basics - Anfänger-Themen 5
D einfache Quizfrage programmieren Java Basics - Anfänger-Themen 11
B Einfache Applets für Webseite Java Basics - Anfänger-Themen 10
K Einfache Rekursion - Wert wird nicht in Variable gespeichert Java Basics - Anfänger-Themen 7
U Einfache Aufgabe Java Basics - Anfänger-Themen 5
E Einfache Frage zur Parameterübergabe in Methoden Java Basics - Anfänger-Themen 8
M einfache Übungsaufgaben gesucht Java Basics - Anfänger-Themen 7
M Einfache Rechnung(R=U/I) Java Basics - Anfänger-Themen 12
D Wohl eine einfache Frage... Java Basics - Anfänger-Themen 2
W Einfache Passwortabfrage funktioniert nicht Java Basics - Anfänger-Themen 3
P einfache GUI-Elemente Java Basics - Anfänger-Themen 10
F Vererbung (einfache Frage) Java Basics - Anfänger-Themen 5
S 2 Einfache Fragen (Exception Breakpoint, Konstruktor) Java Basics - Anfänger-Themen 4
L einfache Klasse erstellen Java Basics - Anfänger-Themen 16
M kleine und einfache Verständnisfrage Java Basics - Anfänger-Themen 3
P Einfache Bedingung (?) in Java Java Basics - Anfänger-Themen 3
W Einfache Rekursion Java Basics - Anfänger-Themen 14
T Einfache Textausgabe .java unter OS X Java Basics - Anfänger-Themen 13
B einfache Rekursion Java Basics - Anfänger-Themen 9
A [Hilfe] einfache Aufgabe Java Basics - Anfänger-Themen 26
A Einfache java Verschlüsselung HILFE Java Basics - Anfänger-Themen 3
M einfache java application Java Basics - Anfänger-Themen 4
S Kann einfache Texteingabe nicht auswerten! Java Basics - Anfänger-Themen 3
M einfache frage zum Jdk-Compiler Java Basics - Anfänger-Themen 3
Spin einfache Frage zu Klassen Java Basics - Anfänger-Themen 12
J einfache Tastendrücke in einem JFrame abfragen Java Basics - Anfänger-Themen 2
C "einfache" If-Abfrage Java Basics - Anfänger-Themen 15
H Einfache Ausgabe eines Arrays in einen File Java Basics - Anfänger-Themen 8
F Einfache Liste hinten was einfügen Java Basics - Anfänger-Themen 3
L Einfache Umrechnung Java Basics - Anfänger-Themen 2
D Einfache Funktion zum kaufmännischen runden Java Basics - Anfänger-Themen 8
K einfache Multiplikation Java Basics - Anfänger-Themen 6
S Einfache Rechnung mit Schleife Java Basics - Anfänger-Themen 10
G einfache Swing-GUI Java Basics - Anfänger-Themen 3
F Einfache Tastatureingabe Java Basics - Anfänger-Themen 2
L [gelöst] Einfache Aufgabe, läuft aber nicht. Java Basics - Anfänger-Themen 8
S "einfache Klassengeschichten" keine Fehler, läuft Java Basics - Anfänger-Themen 2
A Einfache Frage zur Mehrfachvererbung Java Basics - Anfänger-Themen 3
G Einfache Berechnung liefert falsches Ergebnis Java Basics - Anfänger-Themen 2
J eine einfache liste Java Basics - Anfänger-Themen 17
D Suche einfache Übungsaufgaben für den JavaCreator! Java Basics - Anfänger-Themen 5
R Einfache Messagebox Java Basics - Anfänger-Themen 9
N einfache Adressdatenbank in Textdatei Java Basics - Anfänger-Themen 8
I einfache Wiedergabe Java Basics - Anfänger-Themen 2
B Warum hat dieser einfache Algorithmus lineare Laufzeit? Java Basics - Anfänger-Themen 3
U "Einfache Verschlüsselung" Java Basics - Anfänger-Themen 17
K einfache Umfang und Flächenberechnung mit interfaces Java Basics - Anfänger-Themen 3
M Einfache HTML Mail versenden , suche Beispiel Java Basics - Anfänger-Themen 5
L MVC-einfache frage Java Basics - Anfänger-Themen 13
M einfache schleife Java Basics - Anfänger-Themen 7
M Einfache Schleife Java Basics - Anfänger-Themen 4
C Abbruch einer Schleife mit break, meine Übung funktioniert nicht richtig Java Basics - Anfänger-Themen 4
D Regex greift nicht richtig Java Basics - Anfänger-Themen 4
C Darstellung von Datum - Codes richtig? Java Basics - Anfänger-Themen 2
C Rechnen mit Brüchen, ist meine Lösung soweit richtig? Java Basics - Anfänger-Themen 4
M OOP Brüche nicht richtig berechnen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben