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