Swing
Tomasz Borzyszkowski
Już Java 1.0 zawierała bibliotekę AWT (Abstract Window Toolkit) służącą do oprogramowania GUI. Kolejne wersje Java również wspierały to rozwiązanie.
Swing jest częścią JFC (Java Foundation Classes) – zestawu predefiniowanych klas definiujących różne API użytkownika.
Korzyści wynikające z używania zestawu Swing (w stosunku do AWT):
Posiada bogatszy i łatwiejszy w użyciu zestaw elementów interfejsu użytkownika
Rzadko występują błędy zwiazane z niezgodnością platformy
Programy Swing działają tak samo na wszystkich platformach Swing jest bardziej uniwersalny niż starsze rozwiązania bazujące na AWT (i “odpowiednikach” z danego systemu operacyjnego).
Jednak wygląd aplikacji bazującej na Swingu może bardzo się różnić od wyglądu, do którego użytkownik przyzwyczaił się pod danym systemem operacyjnym.
2
Zobacz: TestProstejRamki.java
Biblioteka AWT posiada, opartą na “odpowiednikach”, klasę Frame obsługującą okna najwyższego poziomu. Wersja tej klasy dostarczana przez Swing nazywa się JFrame i dziedziczy z Frame. Oznacza to, że wszystkie elementy okna są rysowane przez menedżera okien systemu operacyjnego, a nie przez Swing.
Ramki są pojemnikami graficznymi (dziedziczą po Container)–
mogą zawierać inne komponenty GUI: przyciski, pola tekstowe, ....
Zobacz: TestRamkiScentrowanej.java
Ramka okna powinna być tak pozycjonowana na ekranie by
zachowywała proporcje względem innych elementów.
Potrzebne informacje możemy pobrać z systemu operacyjnego za pośrednictwem klasy Toolkit. Do ustawiania pozycji lewego górnego narożnika ramki służy metoda: setLocation(x, y).
To samo wraz z ustawieniem rozmiaru ramki uzyskamy metodą: setBounds(x, y, szerokosc, wysokosc).
3
Hierarchia klas JFrame i JPanel
Object
Component
Container
JComponent
Window
JPanel
Frame
JFrame
4
Budowa wewnętrzna obiektu JFrame
W JFrame znajdują się 4
Tytuł
JFrame
panele/powierzchnie.
Najważniejsza jest
JRoot
powierzchnia zawartości.
Na niej dodajemy nowe
Pasek menu
komponety okna.
opcjonalnie
Reszta jest potrzebna do
organizacji menu,
JLayeredPane
powierzchni zawartości i
“wyglądu i wrażenia”.
Powierzchnia
zawartości
Powierzchnia
szklana
5
Aby umieścić na pow. zawartości nowe elementy należy:
zdefiniować klasę rozszerzającą klasę JPanel
przeładować metodę paintComponent(Graphics g) – w niej definiujemy co ma być narysowane
tworzymy obiekt zdefiniowanej klasy
dodajemy go do pow. zawartości
Panale są elementami interfejsu użytkownika, które:
posiadają powierzchnię, po której można rysować
są pojemnikami – tj. mogą przechowywać inne komponenty interfejsu użytkownika (przyciski, pola tekstowe, ....)
Zobacz: NieWitajSwiecie.java
6
Zobacz: TestRysunku.java
Już w wersji 1.0 JDK klasa Graphics posiadała metody umożliwiające rysowanie figur płaskich. Były jednak bardzo ograniczone.
Od wersji SDK 2.0 J2SE zawiera bibliotekę Java 2D z bogatym zbiorem operacji graficznych.
Aby rysować obiekty wystarczy utworzyć obiekt klasy Graphics2D.
Najczęściej robi się to tak:
Graphics2D g2 = (Graphics2D) g;
gdzie g jest parametrem metody paintComponent.
W większości przypadków by narysować kształt, najpierw trzeba utworzyć komponent implementujący interfejs Shape, a następnie wywołać metodę draw klasy Graphics2D.
W SDK 1.0 wielkości figur określano w pikselach. W SDK 2.0 używa się liczb rzeczywistych float i double. Większość kształtów posiada wewnętrzne klasy statyczne o koordynatach obu tych typów, np.
Rectangle2D zawiera
Rectangle2D.Float i Rectangle2D.Double.
7
Kolory i wypełnianie Zobacz:TestWypelnienia.java Metoda setPaint klasy Graphics2D pozwala na wybranie aktualnego koloru rysowania na ekranie.
Klasa Color pozwala zdefiniować kolory używając konstruktora z parametrami RGB koloru. Istnieją w tej klasie także predefiniowane stałe reprezentujące najczęściej używane kolory: blue, yellow,...) Metoda setBackground klasy Component pozwala ustalić kolor tła.
Analogicznie setForeground ustala kolor rysowania.
Metody brighter() i darker() klasy Color tworzą jaśniejsze i ciemniejsze wersje koloru, dla którego zostały wywołane.
Klasa SystemColor zawiera predefiniowane stałe opisujące kolory używane przez różne elementy systemu operacyjnego, np.
ramka.setBackground(SystemColor.window);
dopasuje kolor tła ramki do domyślnego koloru tła okien użytkownika.
8
By wyświetlić obraz w oknie trzeba go najpierw pobrać z pliku lokalnego lub z Internetu. Umożliwia to obiekt typu Toolkit – patrz przykład.
Wyświetlić tak pobrany obraz można metodą drawImage klasy Graphics.
Biblioteka AWT ładując obraz z Internetu często powołuje niezależny wątek oddelegowany do pobierania obrazu, podczas gdy program kontynuuje normalne wykonanie. Może to doprowadzić do zakończenia metody rysowania obrazu na oknie przed jego pobraniem – wyświetlone zostanie puste miejsce.
By temu zapobiec można zastosować obiekt typu MediaTracker, który potrafi śledzić stopień załadowania jednego lub większej liczby obrazów.
Zobacz: TestObrazu.java
Zobacz b. skomplikowany przykład: MandelbrotTest.java 9
Pola tekstowe klasy TextField implementują jednoliniowe pola tekstowe. Umożliwiają edycję lini tekstu. Konstruktory tej klasy pozwalają na inicjalizację pola tekstowego zadanym tekstem i/lub liczbą znaków.
Zawartość pola tekstowego można pobierać i ustawiać metodami getText() i setText() - metoda trim() pozwala usunąć początkowe i końcowe spacje.
Model dla wszystkich dokumentów tekstowych jest opisywany przez interfejs Document. Dzięki temu można nakazać dokumentowi, a nie komponentowi tekstowemu, aby powiadamiał o zmianie zawartości komponentu, instalując obiekt słuchacza dokumentu.
W przeciwnym przypadku śledzenie zmian tekstu musiało by być związane z nasłuchiwaniem klawiatury.
Zobacz: TestTekstu.java
Zobacz: TestObszaruTekstowego.java
10
Często nazywa się je grupą przełączników, radio buttons.
Gdy jeden z przycisków zostaje włączony, poprzednio zaznaczony przycisk powinien się wyłączyć. Najpierw musimy utworzyć grupę przycisków:
ButtonGroup gr = new ButtonGroup();
a następnie dodawać do nich kolejne przyciski:
// wyłączony
gr.add(new JRadioButton(“Pierwszy”, false));
// włączony
gr.add(new JRadioButton(“Pierwszy”, true));
Zobacz: TestPrzelacznikow.java
11
Listy te służą do wybierania więcej niż jednej możliwosci z listy wyboru.
Jeżeli lista ma włączoną opcję umożliwiającą edycję – metoda setEditable(), masz możliwość zmiany wybranego łańcucha.
Metoda getSelectedItem() pobra aktualny element listy.
Fragment zakładający listę:
lista = new JComboBox();
lista.setEditable(true);
lista.addItem(“Pierwszy”);
lista. addItem(“Drugi”);
lista.insertItemAt(“Pierwszy i pol”, 1);
Usuwamy:
lista.removeItem(“Drugi”);
lista.removeItemAt(0);
Zobacz: TestListyKombinowanej.java
12
Menu to obiekt typu JMenuBar, który można dołączyć w dowolnym miejscu okna – zwykle jest to górna część ramki:
ramka.setJMenuBar(pasekMenu);
Następnie możemy do paska menu dodawać kolejne menu rozwijalne –
obiekty typu JMenu, a do nich poszczególne pola typu JMenuItem lub sepatatory.
Do elementów menu możemy dodawać ikony, mnemoniki i klawisze skrótu. Poszczególne pozycje menu możemy tekże włączać i wyłączać.
Więcej szczegółów w przykładowym programie.
Zobacz: TestMenu.java
13