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:
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

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