Do naszych celów wykorzystamy klasę JLabel (standardowa etykieta tekstowa). Rozszerzymy jej możliwości wyposażając ją w obsługę wątków (zaimplementujemy interfejs Runnable). Nowa etykieta będzie co określoną liczbę milisekund zmieniała swoją treść, czyli będzie wyświetlała aktualny czas. Najprostsza wersja nowej klasy Zegar wygląda tak:
import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.text.*;
/**
* Prosty zegar w Swingu
* @author kodatnik.blogspot.com
*/
// nowa klasa Zegar zbudowana w oparciu o klasę JLabel
class Zegar extends JLabel implements Runnable {
// wątek
private Thread watek;
// liczba milisekund pauzy (1000 ms czyli 1 sekunda)
private int pauza = 1000;
// konstruktor klasy
public Zegar() {
// wyrównamy napisy do środka
super("", SwingConstants.CENTER);
// wybieramy font do wyświetlenia zagara (podajemy nazwę, styl oraz rozmiar)
setFont (new Font ("Consolas", Font.BOLD, 28));
// ustalamy kolor tła
setBackground(Color.BLUE);
// ustalamy kolor tekstu
setForeground(Color.WHITE);
// ustawiamy przeźroczystość
setOpaque(true);
}
// metoda start tworzy i uruchamia wątek zegara
public void start() {
// jeśli nie ma działającego wątka, utwórz i uruchom nowy
if (watek == null) {
watek = new Thread(this);
watek.start();
}
}
// metoda wywołana po starcie wątku
public void run() {
// dopóki zmienna watek wskazuje na bieżący wątek
while ( watek == Thread.currentThread()) {
// nowy obiekt klasy Date
Date time = new Date();
// formatowanie
DateFormat df = DateFormat.getTimeInstance(DateFormat.MEDIUM);
// ustawiamy tekst
setText(df.format(time));
try {
// wstrzymujemy działanie wątku na 1 sekundę
watek.sleep(pauza);
} catch (InterruptedException e) {}
}
}
// metoda zatrzymująca zegar (wątek)
public void stop() {
// ustawiamy referencję watek na null
watek = null;
}
}
Gotowa klasa Zegar może zostać użyta w dowolnej aplikacji. Wystarczy tylko dodać ją do odpowiedniego kontenera. Sprawdźmy zatem jej działanie tworząc prostą aplikację w Swingu.public class PrzykladowyZegar extends JFrame {
// konstruktor
public PrzykladowyZegar() {
// tytuł okna
super("Zegar w Swingu");
// rozmiar okna
setSize( 350, 100);
// ustawienie domyślnej akcji przy zamykaniu okna
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// ustawiamy widoczność okna
setVisible(true);
// nie pozwalamy zmieniać rozmiarów okna
setResizable(false);
// tworzymy nowy obiekt klasy Zegar
Zegar zegar = new Zegar();
// dodajmy go do naszego okna
add(zegar);
// startujemy nasz zegar
zegar.start();
}
public static void main(String [] args) {
// utworzenie obiektu i wywołanie konstruktora
new PrzykladowyZegar();
}
}
Całość prezentuje się w następujący sposób:Klasa Zegar, aż prosi się o rozbudowę. Powinniśmy mieć możliwość określenia fontu, kolorów, formatu czy też strefy czasowej podczas tworzenia obiektu. Wystarczy dodać odpowiednie konstruktory i już można będzie wykorzystać kod do tworzenia stoperów czy zegarów wskazujących czas w różnych strefach czasowych.

4 Komentarze - Zegar w Swingu
A może tak analogowy :D/
Dzięki stary uratowałeś moje zaliczenie poprawkowe ;)
Właśnie czegoś takiego szukałem. Super że to opublikowałeś.
niezly blog
Prześlij komentarz
Możesz użyć niektórych tagów HTML, takich jak <b>, <i>, <u>, <a> Nie spamuj :)