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
ModellKlasse
TimeTick Klasse (Wird von der TimeModell KLasse benötigt)
ViewKlasse
ControllerKlasse
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();
}
});
}
}