Komponenty Swing
Transkrypt
Komponenty Swing
Podstawy Swing Tomasz Borzyszkowski Wprowadzenie 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 Proste ramki 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 panele/powierzchnie. Najważniejsza jest powierzchnia zawartości. Na niej dodajemy nowe komponety okna. Reszta jest potrzebna do organizacji menu, powierzchni zawartości i “wyglądu i wrażenia”. Tytuł JFrame JRoot Pasek menu opcjonalnie JLayeredPane Powierzchnia zawartości Powierzchnia szklana 5 Umieszczanie elementów 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 Rysowanie 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 Obrazki 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 Pola tekstowe klasy TextField implementują jednoliniowe pola tekstowe. Umożliwiają edycję linii 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 Przełączniki 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 kombinowane 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 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