Kierunek: Informatyka i Ekonometria Przedmiot: Programowanie komputerów Forma zajęć: Ćwiczenia Temat: Tworzenie aplikacji z wykorzystaniem graficznego interfejsu użytkownika - Swing. Biblioteka SWING podstawowa bliblioteka do tworzenia interfejsów użytkownika, rozszerzenie możliwości biblioteki AWT, napisana całkowicie w Javie, bogaty zestaw komponentów, przyciski, etykiety, listy, drzewa, tabele itp., łatwa zmiana wyglądu aplikacji, pełna obsługa grafiki 2D, drag-and-drop, internacjonalizacja, nazwy obiektów JNazwa, główny pakiet to: javax.swing 1
Główne kontenery JApplet JDialog JFrame Klasa JFrame utworzenie okna z tytułem, ramką, menu, kontener dla innych komponentów. import javax.swing.*; public class Test { public static void main(string[] args) { JFrame ramka = new JFrame("Pierwszy program"); JLabel napis = new JLabel("Tekst"); ramka.add(napis); ramka.setsize(200,200); ramka.setdefaultcloseoperation(jframe.exit_on_close); ramka.setvisible(true); 2
Klasa JPanel podstawowy kontener import javax.swing.* import java.awt.*; class MojPanel extends JPanel { JButton przycisk1,przycisk2,przycisk3; public MojPanel (){ przycisk1 = new JButton("pierwszy"); przycisk2 = new JButton("drugi"); przycisk3 = new JButton("trzeci"); add(przycisk1); add(przycisk2); add(przycisk3); setbackground(color.yellow); public void paintcomponent(graphics g) { super.paintcomponent(g); public class Test { public static void main(string[] args) { JFrame ramka = new JFrame("Aplikacja w SWING'u"); MojPanel panel = new MojPanel(); ramka.add(panel); ramka.setsize(400,100); ramka.setdefaultcloseoperation(jframe.exit_on_close); ramka.setvisible(true); 3
Pozostałe komponenty - kontenery JPanel JScrollPane JSplitPane JTabbedPane JToolBar Pozostałe komponenty JButton JComboBox JList JMenu 4
JSlider JTextField JLabel JProgressBar JToolTip JColorChooser JFileChooser JTable JTextComponent 5
JTree Menedżery rozkładu główne kontenery korzystają z rozkładu BorderLayout, kontener JPanel używa rozkładu FlowLayout, zmiana domyślnego rozkądu to metoda setlayout() JPanel panel = new JPanel(); panel.setlayout(new BorderLayout()); BorderLayout BoxLayout FlowLayout GridLayout GridBagLayout 6
Obsługa zdarzeń deklaracja klasy obsługującej zdarzenia (interfejs ActionListener), class Obsluga implements ActionListener stworzenie kodu uruchamianego podczas konkretnego zdarzenia, public void actionperformed (ActionEvent e) rejestracja obiektu powyższej klasy jako nasłuchiwacza dla jednego bądź też wielu komponentów, komponent.addlistener (obiekt klasy Obsluga) import odpowiednich interfejsów i klas do obsługi zdarzeń. import java.awt.event.*; Zdarzenia i powiązane z nimi typy nasłuchiwaczy Typ zdarzenia Kliknięcie na przycisku, naciśnięcie klawisza Enter podczas pisania w polu tekstowym, wybranie pozycji z menu Zamknięcie ramki (główne okno) Obługa przycisków myszy Obsługa poruszania myszą Komponent staje się widoczny Komponent uzyskuje fokus Wybór z listy Typ nasłuchiwacza ActionListener WindowListener MouseListener MouseMotionListener ComponentListener FocusListener ListSelectionListener Przykładowa aplikacja import javax.swing.*; import java.awt.*; import java.awt.event.*; class MojPanel extends JPanel { JButton przycisk1,przycisk2,przycisk3; public MojPanel (){ przycisk1 = new JButton("Czerwony"); przycisk2 = new JButton("Zielony"); przycisk3 = new JButton("Żółty"); add(przycisk1); add(przycisk2); add(przycisk3); 7
Obsluga dzialanie1 = new Obsluga(Color.red); Obsluga dzialanie2 = new Obsluga(Color.green); Obsluga dzialanie3 = new Obsluga(Color.yellow); przycisk1.addactionlistener(dzialanie1); przycisk2.addactionlistener(dzialanie2); przycisk3.addactionlistener(dzialanie3); setbackground(color.white); public void paintcomponent(graphics g) { super.paintcomponent(g); private class Obsluga implements ActionListener { private Color kolor; public Obsluga(Color k){ this.kolor = k; public void actionperformed(actionevent e){ setbackground(kolor); repaint(); public class Test { public static void main(string[] args) { JFrame ramka = new JFrame("Aplikacja w SWING'u"); MojPanel panel = new MojPanel(); ramka.add(panel); ramka.setsize(400,100); ramka.setdefaultcloseoperation(jframe.exit_on_close); ramka.setvisible(true); 8
Grafika metoda paintcomponent(graphics g) grafika dwuwymiarowa: klasa Graphics2D przykładowe klasy pakietu java.awt.geom: Ellipse2D Point2D, Line2D,Rectangle2D, czcionki: klasa Font kolory: klasa Color import javax.swing.*; import java.awt.*; import java.awt.geom.*; class MojPanel extends JPanel { JButton przycisk1,przycisk2,przycisk3; public MojPanel (){ setbackground(color.white); public void paintcomponent(graphics g) { super.paintcomponent(g); Graphics2D g2 = (Graphics2D) g; public class Test { g2.setpaint(color.red); Line2D linia = new Line2D.Double (10,10,380,10); g2.draw(linia); g2.setpaint(color.green); Rectangle2D pros = new Rectangle2D.Double (10,20,370,40); g2.draw(pros); g2.setpaint(color.blue); Font czcionka = new Font("Tahoma", Font.BOLD, 20); g2.setfont(czcionka); g2.drawstring("figury geometryczne",10,120); public static void main(string[] args) { JFrame ramka = new JFrame("Figury"); MojPanel panel = new MojPanel(); ramka.add(panel); ramka.setsize(400,200); ramka.setdefaultcloseoperation(jframe.exit_on_close); 9
ramka.setvisible(true); Swing w przykładach http://java.sun.com/docs/books/tutorial/uiswing/index.html Zadania 1. Dodaj do przykładowego kodu dwa nowe przyciski "Biały" oraz "Niebieski". Dodaj również etykietę tekstową JLabel, która będzie zawierać napis: Aktualny kolor to: aktualny kolor. Uzupełnij brakujący kod tak, aby aplikacja działała prawidłowo. Wykorzystaj BorderLayout oraz dodatkowe kontenery. Tekst z przycisku możesz pobrać za pomocą metody getactioncommand() dostępnej w klasie ActionEvent. 10
2. Napisz prosty kalkulator. +---------------+-+ Kalkulator x +---------------+-+ Pole tekstowe +---+---+---+---+ 7 8 9 / +---+---+---+---+ 4 5 6 x +---+---+---+---+ 1 2 3 - +---+---+---+---+ 0. = + +---+---+---+---+ Wykorzystaj obsługę zdarzeń, komponenty itd. 3. Napisz nastepujaca aplikacje: +---------------------------------------------------------------------------+-+ MiniOutlook - Imię i Nazwisko x +---------------------------------------------------------------------------+-+ Plik Wiadomość Konto Pomoc +-----------------------------------------------------------------------------+ 1 2 3 4 5 +-------------------------+------------+---------------------------+----------+ -MiniOutlook Od Temat Rozmiar `-Foldery Lokalne +------------+---------------------------+----------+ -Skrzynka odbiorcza Arek Zaproszenie 12 KB -Skrzynka nadawcza Madzia Wyniki 3 KB -Elementy wyslane Jurek FWD: Smieszne 195 KB `-Kopie robocze +---------------------------------------------------+ Zapraszam Was serdecznie dzis na spotkanie do- tyczace znajomosci GUI w srodowisku JAVA. Sala 426 godz 14.00 pozdrawiam Arkadiusz Markowski +-------------------------+---------------------------------------------------+ Wiadomosci: 34, nie przeczytane: 53 +-----------------------------------------------------------------------------+ Aplikacja: Tytuł: MiniOutlook - Imię Nazwisko (proszę podać swoje dane) Całość zawiera Menu, Toolbar z obrazkami oraz główne okno podzielone na 4 cześci: 1 cześć: Drzewo z odpowiednią struktura 2 cześć: Tabela z wiadomościami 3 cześć: Podgląd wiadomości (komponent tekstowy) 4 cześć: Status (komponent tekstowy) 11
Wszystkie komponenty zostały opisane ponizej: Menu: Struktura menu: Plik - Nowy, Otwórz, Zapisz Importuj, Exportuj Drukuj Zamknij Wiadomość - Nowa, Odpowiedz nadawcy, Prześlij dalej Konto - Nowe, Właściwości Pomoc - Spis treści O programie gdzie to separator Toolbar: 5 przycisków (grafika na stronie 1.gif itd.) podpowiedzi (tooltipsy pod przyciskami): - Napisz wiadomość - Odpowiedz nadawcy - Odpowiedz wszystkim - Prześlij dalej - Wyślij i odbierz wszystkie Drzewo: Struktura taka jak na formatce Tabela: Struktura i zawartość taka jak na formatce Podglad: Zawartość taka jak na formatce Status: Zawartość taka jak na formatce 12