Eine Uhr mit Digitalanzeige und Schaltknöpfen
public
class DigitalUhr
extends JFrame {
private
static final String
TITEL = "Digitaluhr",
KNOPF_EIN = "Ein",
KNOPF_AUS =
"Aus", KNOPF_UM =
"Um";
private
static
final
long
FREQUENZ
= 1000,
FREQUENZ_UM
= 3000;
// 1 bzw. 3 sec
private
static final
int BREITE
= 400, HÖHE = 300;
// Größe des Frames
private
boolean
uhrAn
=
true;
private long
frequenz;
private JLabel
anzeige;
private JButton[]
knöpfe; // Ein,
Aus, Um;
DigitalUhr() {
uhrAn = true;
frequenz = FREQUENZ;
tick(); // uhrzeit wird
initialisiert
setTitle(TITEL);
setSize(BREITE,
HÖHE);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new
FlowLayout(FlowLayout.CENTER,
10, 10));
add(new
JLabel(TITEL));
anzeige =
new JLabel();
add(anzeige);
knöpfe = new JButton[3];
knöpfe[0] =
new JButton(KNOPF_EIN);
knöpfe[1] = new JButton(KNOPF_AUS);
knöpfe[2] = new JButton(KNOPF_UM);
for (JButton knopf :
knöpfe)
super.add(knopf);
knöpfe[0].setEnabled(false);
// "Ein"
ActionListener
lauscher =
new
ActionListener() {
@Override
public
void
actionPerformed(ActionEvent e) {
switch (e.getActionCommand())
{ // Beschriftung des Knopfs
case
KNOPF_EIN:
uhrAn =
true;
break;
case
KNOPF_AUS:
uhrAn = false;
break;
case
KNOPF_UM:
frequenz = frequenz ==
FREQUENZ ?
FREQUENZ_UM :
FREQUENZ;
break; }
knöpfe[0].setEnabled(!uhrAn);
knöpfe[1].setEnabled(uhrAn);
} };
for
(JButton knopf :
knöpfe)
knopf.addActionListener(lauscher);
tick();
// anzeige mit der Uhrzeit initialisieren
pack();
setVisible(true);
new
Thread() {
@Override
public
void
run() {
try
{
while
(true)
{
tick();
Thread.sleep(frequenz);
} }
catch
(InterruptedException e) { } } }.start(); }
private
void tick() {
if
(uhrAn)
{
Calendar kalender = Calendar.getInstance();
anzeige.setText(String.format("%02d:%02d:%02d",
kalender.get(Calendar.HOUR),
kalender.get(Calendar.MINUTE),
kalender.get(Calendar.SECOND)));
} }
public
static
void
main(String[] args) {
new DigitalUhr(); } }
Am Anfang des Programms werden die Konstanten als
static final festgelegt, um sie ggf. leicht modifizieren zu können.
Die Methode tick()
berechnet die aktuelle Uhrzeit und zeigt sie an einem
JLabel an. Sie wird im Konstruktor
aufgerufen, sowie vom im Konstruktor erzeugten und gestarteten
Thread
einmal pro Sekunde oder alle drei Sekunden (frequenz
ist 1000 oder 3000 Millisekunden).
Beim Umschalten wird das Attribut
frequenz (die
sleep()-Zeit in
Thread)
zwischen den Werten
FREQUENZ (1000 ms) und
FREQUENZ_UM (3000 ms) umgeschaltet.
Die Methode tick()
aktualisiert die Anzeige nur, wenn die Uhr eingeschaltet ist.
Den drei Knöpfen wird der gleiche
ActionListener hinzugefügt, dessen
actionPerformed()
nach der Beschriftung der Knöpfe zwischen den Aktionen unterscheidet. Eine
Alternative wäre gewesen, jedem Knopf seinen eigenen
ActionListener zu programmieren.
Version: 19. April 2012
© Prof. Solymosi, 20102 Beuth-Hochschule für Technik Berlin, Fachbereich VI (Informatik und Medien)
solymosibht-berlin.de