Zegar w Swingu

Chcemy napisać aplikację wyświetlającą prosty zegar. Wykorzystamy do tego celu interfejs graficzny GUI czyli bibliotekę Swing oraz wątki. Całość ma być na tyle uniwersalna, aby możliwe było wykorzystanie zegara w dowolnej aplikacji.

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:
01.import java.awt.*;
02.import javax.swing.*;
03.import java.util.*;
04.import java.text.*;
05. 
06./**
07. * Prosty zegar w Swingu
08. * @author kodatnik.blogspot.com
09. */
10. 
11.// nowa klasa Zegar zbudowana w oparciu o klasę JLabel
12.class Zegar extends JLabel implements Runnable {
13. // wątek
14. private Thread watek;
15. // liczba milisekund pauzy (1000 ms czyli 1 sekunda)
16. private int pauza = 1000;
17. 
18. // konstruktor klasy
19. public Zegar() {
20.  // wyrównamy napisy do środka
21.  super("", SwingConstants.CENTER);
22.  // wybieramy font do wyświetlenia zagara (podajemy nazwę, styl oraz rozmiar)
23.  setFont (new Font ("Consolas", Font.BOLD, 28));
24.  // ustalamy kolor tła
25.  setBackground(Color.BLUE);
26.  // ustalamy kolor tekstu
27.  setForeground(Color.WHITE);
28.  // ustawiamy przeźroczystość
29.  setOpaque(true);
30. }
31. 
32. // metoda start tworzy i uruchamia wątek zegara
33. public void start() {
34.  // jeśli nie ma działającego wątka, utwórz i uruchom nowy
35.  if (watek == null) {
36.   watek = new Thread(this);
37.   watek.start();
38.  }
39. }
40. 
41. // metoda wywołana po starcie wątku
42. public void run() {
43.  // dopóki zmienna watek wskazuje na bieżący wątek
44.  while ( watek == Thread.currentThread()) {
45.   // nowy obiekt klasy Date
46.   Date time = new Date();
47.   // formatowanie
48.   DateFormat df = DateFormat.getTimeInstance(DateFormat.MEDIUM);
49.   // ustawiamy tekst
50.   setText(df.format(time));
51.   try {
52.    // wstrzymujemy działanie wątku na 1 sekundę
53.    watek.sleep(pauza);
54.   } catch (InterruptedException e) {}
55.  }
56. }
57. 
58. // metoda zatrzymująca zegar (wątek)
59. public void stop() {
60.  // ustawiamy referencję watek na null
61.  watek = null;
62. }
63.}
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.
01.public class PrzykladowyZegar extends JFrame {
02. 
03. // konstruktor
04. public PrzykladowyZegar() {
05.  // tytuł okna
06.  super("Zegar w Swingu");
07.  // rozmiar okna
08.  setSize( 350, 100);
09.  // ustawienie domyślnej akcji przy zamykaniu okna
10.  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
11.  // ustawiamy widoczność okna
12.  setVisible(true);
13.  // nie pozwalamy zmieniać rozmiarów okna
14.  setResizable(false);
15. 
16.  // tworzymy nowy obiekt klasy Zegar
17.  Zegar zegar = new Zegar();
18.  // dodajmy go do naszego okna
19.  add(zegar);
20. 
21.  // startujemy nasz zegar
22.  zegar.start();
23. }
24. 
25. public static void main(String [] args) {
26.  // utworzenie obiektu i wywołanie konstruktora
27.  new PrzykladowyZegar();
28. }
29.}
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

CamilYedrzejuq pisze...

A może tak analogowy :D/

http://www.wybieramlaptopa.pl/ pisze...

Dzięki stary uratowałeś moje zaliczenie poprawkowe ;)

Marek pisze...

Właśnie czegoś takiego szukałem. Super że to opublikowałeś.

obiady domowe pisze...

niezly blog

Prześlij komentarz

Możesz użyć niektórych tagów HTML, takich jak <b>, <i>, <u>, <a> Nie spamuj :)

Popularne posty