package javacodebook.gui.timelabel; import javax.swing.*; import java.awt.*; import java.awt.event.*; /** * Auf dem TimeFrame wird im SOUTH Bereich ein selbstgebautes Label * mit dem Namen TimeLabel platziert, dieses Label zeigt fortlaufend * die aktuelle Uhrzeit an. */ public class TimeFrame extends Frame { /** * Das TimeLabel ist sowohl Label, als auch ein Runnable Objekt. */ private TimeLabel time = new TimeLabel(); private TextArea center = new TextArea(5,20); /** * Konstruktor von TimeFrame. */ public TimeFrame(String title) { super(title); // Beim Klicken des Schließen-Buttons vom HauptFenster // wird das Programm beendet. this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent we) { System.exit(0); } }); this.setLayout(new BorderLayout()); this.add(center,BorderLayout.CENTER); // Der Thread mit dem Runnable-Objekt time wird gestartet Thread t = new Thread(time); t.start(); // Das TimeLabel wird, wie jede andere Komponentne einfach // auf dem Container platziert. this.add(time,BorderLayout.SOUTH); } } --- Neue Klasse --- package javacodebook.gui.timelabel; import java.util.Date; import java.awt.Label; import java.text.SimpleDateFormat; /** * Das TimeLabel zeigt die laufende Uhrzeit an. * Damit sonstige Aufgaben nicht in Mitleidenschaft gezogen werden, * wird die Darstellung der Zeit in einem extra Thread realisiert **/ class TimeLabel extends Label implements Runnable { private SimpleDateFormat sdf = new SimpleDateFormat("'Es ist ' hh:mm:ss ' Uhr'"); private String dateString; private Date d = new Date(); public TimeLabel() { setAlignment(Label.CENTER); setText(getDateString()); } /** * Liefert das formatierte Datum in Form eines Strings zurück. **/ private String getDateString() { // Aktuelle Uhrzeit wird ermittelt, und dem Datums-Objekt zugewiesen d.setTime(System.currentTimeMillis()); // aus dem Datumsobjekt wird nach obiger Vorgabe (im Konsruktor von SimpleDateFormat) // ein String erstelllt dateString = sdf.format(d); return dateString; } /** * Die run()-Methode, muss überschrieben werden, da Sie im Runnable Interface definiert ist. * Sie wird ausgeführt, wenn der Thread gestartet wurde. **/ public void run() { // Endlos-Schleife while(true) { // Dem Label wird die Beschriftung mit der aktuellen Uhrzeit zugewiesen this.setText(getDateString()); // Da nur Sekunden angezeigt werden, kann der Thread sich ohne Auswirkungen // für eine knappe Sekunde schlafen legen. try { Thread.currentThread().sleep(995); // Bei 1000 msec könnte eine Sekunde übersprungen werden } catch (InterruptedException ie) { ie.printStackTrace(); } } } }