Pochwal się obrazkami

Java udostępnia dwie standardowe biblioteki AWT i

SWING

, które są wykorzystywane podczas tworzenia aplikacji wyposażonych w GUI (Graphics User Interface). We wczesnych wersjach języka dostępna była tylko AWT, natomiast nowszy, ulepszony moduł SWING powstał nieco później. W dużej mierze korzysta on jednak z zasobów AWT i dlatego właśnie podczas przygotowywania programów wyposażonych w interfejs graficzny sięgniemy po pakiety należące do obydwu bibliotek (głównie java.awt i

javax.swing

).

Jak obchodzić się z AWT i

SWING

? Pokażę to na przykładzie aplikacji Galeria zdjęć. Jej nazwa mówi właściwie wszystko: będzie to program prezentujący pliki graficzne.

Po pierwsze – okno

Naszą galerię zbudujemy z dwóch elementów. Pierwszy to klasa Galeria, która odwołuje się do klasy PanelObraz, opisanej w osobnym pliku. Tylko Galeria jest klasą zawierającą metodę

main()

– bo tylko w jednej klasie wolno tę funkcję implementować. Obu klasom musimy natomiast nadać status klas publicznych, gdyż znajdują się one w oddzielnych plikach.

Tworzenie programu rozpoczynamy zatem od opisania głównej klasy, która odpowiada za wyświetlenie okna aplikacji. Okno w Javie definiuje klasa JFrame, zawarta w pakiecie javax.swing. Sam zaś proces konstruowania okna może się odbywać w dwojaki sposób. Pierwsza metoda polega na utworzeniu obiektu klasy JFrame i zdefiniowaniu jego właściwości. Drugim sposobem jest utworzenie klasy rozszerzającej klasę JFrame i zdefiniowanie jej właściwości. Później będzie trzeba tylko wywołać obiekt tej nowej klasy.

Wybieramy drugi wariant i w jednym pliku implementujemy klasy Galeria oraz

Okno

:

class Okno extends JFrame{ … }

Konstruktorem klasy Okno posłużymy się, implementując zawartość okna. W klasie Galeria wywołujemy natomiast obiekt tej klasy i definiujemy samo okno:

Okno ok=new Okno();
ok.setTitle(“Galeria zdjęć.”);
ok.pack();
ok.setSize(440,368);
ok.setLocationRelativeTo(null);
ok.setVisible(true);
ok.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Klasa Okno, rozszerzając klasę JFrame, przejmuje jej wszystkie metody. Aby zatem wyświetlić na pasku tytułowym okna łańcuch znakowy, wywołujemy metodę setTitle(), przekazując jako jej parametr obiekt typu String. W celu rozmieszczenia komponentów w oknie sięgamy po funkcję pack(). Następnie stosujemy metodę setSize(), aby określić rozmiar okna. Jeśli tego nie uczynimy, jego szerokość i wysokość będą równe zero, na ekranie zobaczymy więc tylko pasek tytułowy.

Standardowo nowe okno jest umieszczane w lewym górnym rogu ekranu. Dobrze byłoby je przesunąć na środek; pomocna okazuje się metoda setLocationRelativeTo(). Musimy jej przekazać parametr null .

Bardzo istotną funkcją jest setVisible(). Gdy jej nie wywołamy, okno nie będzie widoczne. Korzystamy zatem z setVisible(), a jako wartość podajemy true .

Na koniec pozostało nam wywołanie metody setDefaultCloseOperation(), pozwalającej zamknąć okno. Pominięcie tej funkcji uniemożliwiłoby nam normalne zakończenie działania naszego programu. Nie bez znaczenia jest wartość parametru przekazywana metodzie. Klasa JFrame oferuje kilka predefiniowanych stałych statycznych. Mają one swoje odpowiedniki w postaci liczb całkowitych, które możemy przekazać do

setDefaultCloseOperation()

:

  • EXIT_ON_CLOSE (3) – zamyka okno i kończy działanie całego programu;
  • DO_NOTHING_ON_CLOSE (0) – nie zamyka okna i nie kończy działania programu;
  • HIDE_ON_CLOSE (1) – wyłącza tylko widoczność okna;
  • DISPOSE_ON_CLOSE (2) – zamyka okno, ale nie kończy działania całego programu.
  • Jako wartość parametru metody podajemy więc JFrame.EXIT_ON_CLOSE albo liczbę 3. Pozwoli nam to zatrzymać program w momencie zamknięcia jego okna.

    Zaznaczmy, że istotna jest kolejność wywoływania funkcji. Po metodę setLocationRelativeTo() sięgnęliśmy, jeszcze zanim odwołaliśmy się do setVisible(). Gdybyśmy postąpili odwrotnie, okno pokazałoby się najpierw w lewym górnym narożniku ekranu i natychmiast zostałoby przesunięte na jego środek. Taka, a nie inna kolejność wywołania metod pozwala uniknąć nieprzyjemnego efektu “skakania” okna.

    Pora na środek

    Na razie udało nam się zbudować tylko puste okno. Dobrze byłoby wypełnić je jakimś obrazkiem. Zrobimy to, ale na raty: w Javie okno to kontener, czyli element służący do przechowywania innych elementów, zwanych komponentami. Komponenty możemy umieszczać bezpośrednio w oknie, jednak czasami lepiej jest zastosować panel, czyli komponent okna stanowiący kontener dla innych komponentów.

    Panel tworzymy poprzez wywołanie konstruktora klasy JPanel, lub – tak jak to uczyniliśmy w przypadku klasy

    JFrame

    – poprzez utworzenie nowej klasy rozszerzającej klasę JPanel, a następnie wywołanie jej konstruktora. A zatem zbudujmy podstawowy panel dla okna:

    JPanel panel1=new JPanel();
    panel1.setPreferredSize(new Dimension(440,368));
    panel1.setBackground(white);
    panel1.setLayout(new BorderLayout());

    add(panel1);

    Importowanie statyczne
    Jeżeli w kodzie programu często odwołujemy się do jakiejś zmiennej, możemy skorzystać z importowania statycznego. Wystarczy, że użyjemy dyrektywy import static i podamy nazwę pakietu, klasy i interesującej nas zmiennej statycznej.
          Pracując nad utworzeniem galerii zdjęć, odwołaliśmy się do tej metody, aby pokolorować główne okno programu. Nadaliśmy mu białą barwę, ale do dyspozycji mamy także inne kolory, zdefiniowane jako stałe statyczne klasy Color (black, blue, cyan, darkGray, gray, green, lightGray, magenta, orange, pink, red, white i yellow).

    Najpierw tworzymy obiekt klasy JPanel, a później wywołujemy metodę setPreferredSize(), określającą rozmiar naszego panelu. Funkcja ta pobiera obiekt Dimension wraz z parametrami opisującymi szerokość i wysokość obiektu. Następnie za pomocą metody setBackground() definiujemy kolor. Informację o tym, jaką barwę powinien przybrać panel, możemy podać na dwa sposoby: przekazujemy obiekt klasy Color albo odwołujemy się do dostępnych stałych statycznych tej klasy. Jedną z nich jest white; do dyspozycji mamy także inne, opisane w ramce obok.

    Zauważmy, że przed nazwą koloru nie podaliśmy nazwy klasy. Stało się tak dlatego, że skorzystaliśmy z tzw. statycznego importowania. Służy ono właśnie do zaimportowania zmiennej statycznej tuż przed implementacją klasy. Taka zmienna jest następnie wykorzystywana wewnątrz programu:

    import static java.awt.Color.white;

    Jak widać, w celu zaimportowania zmiennej podajemy nazwę pakietu, nazwę klasy i nazwę jej zmiennej statycznej. Tego typu importowanie jest szczególnie przydatne w sytuacji, gdy w programie często odwołujemy się do jakiejś zmiennej.

    Sposób rozmieszczenia elementów wchodzących w skład panelu jest ustalony. Domyślnie jest to

    FlowLayout

    (układ strumieniowy). Obiekt tej klasy rozmieszcza komponenty po kolei, przy czym standardowo układa je od strony lewej do prawej. My jednak dla naszego głównego panelu zastosowaliśmy rozmieszczenie typu BorderLayout, czyli rozmieszczenie krawędziowe. Polega ono na umieszczaniu komponentów w określonym miejscu, stanowiącym jeden z kierunków geograficznych. Istnieje pięć takich obszarów:

    NORTH

    (północ),

    SOUTH

    (południe),

    WEST

    (zachód),

    EAST

    (wschód) oraz

    CENTER

    (centrum).

    Ostatnią użytą funkcją jest metoda add(), która dodaje komponent do kontenera. Za pomocą add() umieściliśmy główny panel w oknie naszego programu.