Programowanie GUI
Transkrypt
Programowanie GUI
Programowanie graficznego interfejsu użytkownika Wykład 9 Maciej Wołoszyn mailto:[email protected]∗ 17 maja 2006 Spis treści 1 JFC/Swing – c.d. 1.1 1.2 1.3 1.4 1.5 1 Obsługa zdarzeń . . . . . . . . . . . . . . . . . . . 1.1.1 Klasy zdarzeń . . . . . . . . . . . . . . . . 1.1.2 Interfejsy nasłuchujace ˛ . . . . . . . . . . . 1.1.3 Adaptery . . . . . . . . . . . . . . . . . . 1.1.4 Zastosowanie klas wewn˛etrznych . . . . . Definiowanie wygladu ˛ i zachowania komponentów Rysowanie w oknie . . . . . . . . . . . . . . . . . Standardowe okna dialogowe . . . . . . . . . . . . Wybrane środowiska programistyczne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 2 2 3 4 5 7 9 10 1 JFC/Swing – c.d. 1.1 Obsługa zdarzeń • każde działanie użytkownika (np. naciśni˛ecie przycisku, wybór opcji menu) powoduje wygenerowanie zdarzenia – obiektu klas dziedziczacej ˛ po java.util.EventObject (można także generować zdarzenia nie zwiazane ˛ z GUI) ∗ Prosz˛ e o przesyłanie na ten adres informacji o znalezionych bł˛edach, literówkach oraz propozycji zmian i uzupełnień. Dokument przygotowano za pomoca˛ systemu LATEX. Prawa autorskie zastrzeżone. 1 Programowanie GUI – Wykład 9 2 • Java używa modelu delegowania zdarzeń – wygenerowane zdarzenia sa˛ przekazywane do obiektów nasłuchujacych ˛ • obiekty nasłuchujace ˛ musza˛ być rejestrowane (w źródle zdarzenia); służa˛ do tego metody: addTypListener(TypListener e) (każdy Typ zdarzeń ma własna˛ metod˛e) • kiedy wystapi ˛ zdarzenie określonego typu, to jego kopia zostanie przekazana do wszystkich obiektów nasłuchujacych ˛ zarejestrowanych dla tego typu zdarzeń (jest to tzw. grupowe rozgłaszanie) • jeśli jakiś typ zdarzeń nie dopuszcza zarejestrowania jednocześnie kilku obiektów nasłuchujacych, ˛ to metoda addTypListener(TypListener e) b˛edzie rzucać wyjatek ˛ java.util.TooManyListenersException (dopuszczalne jest wtedy tylko wysyłanie jednostkowe) • obiekty nasłuchujace ˛ można także „wyrejestrować” metoda˛ removeTypListener(TypListener e) • przykładem źródła zdarzeń zwiazanych ˛ z mysza˛ i klawiatura˛ jest klasa Component 1.1.1 Klasy zdarzeń • klasy zdarzeń pochodza˛ od EventObject, niektóre z nich to: – ActionEvent – naciśni˛ecie przycisku, dwukrotne klikni˛ecie elementu listy, wybór pozycji z menu – AdjustmentEvent – przesuni˛ecie paska przewijania – ItemEvent – wybór elementu z listy albo pola wyboru – KeyEvent – naciśni˛ecie/zwolnienie klawisza klawiatury – MouseEvent – zdarzenia zwiazane ˛ z przesuwaniem myszy i użyciem jej przycisków – WindowEvent – zmiana stanu, otwarcie, zamkni˛ecie okna każda z powyższych klas zawiera zestaw metod (np. getX() dla klasy MouseEvent) i stałych (np. SELECTED i DESELECTED dla klasy ItemEvent) pozwalajacych ˛ na uzyskanie szczegółowych informacji o zdarzeniu 1.1.2 Interfejsy nasłuchujace ˛ • obiekty nasłuchujace ˛ musza˛ implementować zdefiniowane w pakiecie java.awt.event interfejsy definiujace ˛ metody do obsługi zdarzeń danego typu; przykłady: – ActionListener – definiuje metod˛e actionPerformed(ActionEvent e) Programowanie GUI – Wykład 9 3 – ItemListener – metoda itemStateChanged(ItemEvent e) – KeyListener – metody keyPressed(KeyEvent e) keyReleased(KeyEvent e) keyTyped(KeyEvent e) (uruchamiana, gdy na klawiturze wpisano znak) – MouseListener – m.in. mouseClicked(MouseEvent e) – WindowListener – m.in. windowClosing(WindowEvent e) • wystapienie ˛ zdarzenia powoduje, że źródło wywoła odpowiednia˛ metod˛e zaimplementowana˛ w obiekcie nasłuchujacym ˛ import javax.swing.*; import java.awt.*; import java.awt.event.*; class L implements MouseListener { public void mouseClicked(MouseEvent e){ System.out.println("[Klik]"); } public void mouseExited(MouseEvent e){ System.out.println("[Out]"); } public void mouseEntered(MouseEvent e){ System.out.println("[In]"); } public void mousePressed(MouseEvent e){} public void mouseReleased(MouseEvent e){} } class P02 { public static void main(String[] args) { Frame f = new Frame("Moje okno"); L ml = new L(); f.addMouseListener(ml); f.setVisible(true); } } 1.1.3 Adaptery • klasy upraszczajace ˛ tworzenie obiektów obsługujacych ˛ zdarzenia • zawieraja˛ gotowe, puste implementacje wszystkich wymaganych przez interfejs metod Programowanie GUI – Wykład 9 4 • przykłady: – KeyAdapter – MouseAdapter – WindowAdapter Przykład: zamkni˛ecie okna wymaga zaimplementowania metody windowClosing() interfejsu WindowListener i użycia instrukcji setVisible(false) oraz zakończenia programu za pomoca˛ System.exit(0); dzi˛eki WindowAdapter nie musimy implementować wszystkich metod interfejsu WindowListener class WA extends WindowAdapter { JFrame f; WA(JFrame f) { this.f=f; } public void windowClosing(WindowEvent e){ f.setVisible(false); System.exit(0); } } class P03 { public static void main(String[] args) { JFrame f = new JFrame("Moje okno"); WA wa = new WA(f); f.addWindowListener(wa); f.setSize(300,200); f.setVisible(true); } } 1.1.4 Zastosowanie klas wewnetrznych ˛ • dalsza możliwość uproszczenia kodu dzi˛eki temu, że klasa wewn˛etrzna ma dost˛ep do danych z zewn˛etrznego zakresu • mechanizm przydatny zwłaszcza dla zdarzeń niewymagajacych ˛ skomplikowanej obsługi public static void main(String[] args) { JFrame f = new JFrame("Moje okno"); class IWA extends WindowAdapter { public void windowClosing(WindowEvent e){ System.exit(0); } Programowanie GUI – Wykład 9 5 } f.addWindowListener(new IWA()); f.setSize(300,200); f.setVisible(true); } • kolejne uproszczenie może być wykonane za pomoca˛ anonimowych klas wewn˛etrznych public static void main(String[] args) { JFrame f = new JFrame("Moje okno"); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e){ System.exit(0); } }); f.setSize(300,200); f.setVisible(true); } • zamykanie okna programu nie wymaga koniecznie obsługi zdarzeń – jest możliwe również poprzez wywołanie metody setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); (zast˛epuje obsług˛e zamykania okna poprzez zdarzenie WindowEvent) 1.2 Definiowanie wygladu ˛ i zachowania komponentów • wyglad ˛ komponentów zawierajacych ˛ tekst można modyfikować metodami takimi jak: setFont(Font font) JLabel l = new JLabel("abcdef..."); l.setFont(new Font( "Helvetica",Font.BOLD,50) ); • tekst może być również formatowany z użyciem znaczników HTML String s = "<html><p>Line 1</p>"; s=s+"<p><i>Line 2</i></p>"; s=s+"<p><font color=red>Line 3</font></p>"; Programowanie GUI – Wykład 9 6 s=s+"</html>"; JLabel l = new JLabel(s); • komponenty, które zajmuja˛ (lub moga˛ zajać) ˛ wi˛ecej miejsca niż jest dost˛epne dla nich w oknie umieszcza si˛e cz˛esto wewnatrz ˛ obiektu JScrollPane JTextArea ta = new JTextArea(); for(int i=1; i<20; i++) ta.append("-> "+i+"\n"); JScrollPane sp = new JScrollPane(ta); c.add(sp); • ustawienie domyślnego przycisku (wybieranego naciśni˛eciem Entera) wymaga użycia dla obiektu JRootPane funkcji setDefaultButton(JButton defaultBt) JButton bYes = new JButton("Yes"); JButton bNo = new JButton("No"); JButton bCancel = new JButton("Cancel"); c.add(bYes); c.add(bNo); c.add(bCancel); f.getRootPane().setDefaultButton(bCancel); • podpowiedzi w „dymkach” (tool-tips) definiowane sa˛ w bardzo prosty sposób poprzez użycie funkcji setToolTipText(String s) Programowanie GUI – Wykład 9 7 JButton bStop = new JButton("Stop"); c.add(bStop); bStop.setToolTipText( "Stops current activity"); 1.3 Rysowanie w oknie • wymaga dost˛epu do kontekstu graficznego (obiektu klasy Graphics przekazywanego np. do metody paint(Graphics g) albo możliwego do uzyskania za pomoca˛ getGraphics()) • metoda paint(Graphics g) jest wywoływana automatycznie za każdym razem, gdy trzeba wyświetlić zawartość okna (np. po jego utworzeniu, przywróceniu itp.), nie należy jej używać bezpośrednio • ponowne odrysowanie zawartości okna można wymusić metoda˛ repaint() • współrz˛edne ekranowe obliczane sa˛ od lewego górnego rogu okna w którym rysujemy • elementy nie mieszczace ˛ si˛e w oknie zostana˛ automatycznie przyci˛ete • przykłady metod klasy Graphics: – drawString(String s,int x,int y) – drawLine(int x0,int y0,int x1,int y1) – drawOval(int xl,int yt,int w,int h) – fillOval(int xl,int yt,int w,int h) • jako obszar rysowania wykorzystywana jest cz˛esto klasa dziedziczaca ˛ po JPanel i definiujaca ˛ własna˛ wersj˛e metody paintComponent(Graphics g) Programowanie GUI – Wykład 9 class Plot extends JPanel { int x=-50, y=-50; public void paintComponent(Graphics g) { super.paintComponent(g); g.fillOval(x,y,5,5); g.drawOval(x-5,y-5,15,15); g.drawOval(x-10,y-10,25,25); } } class ML extends MouseAdapter { Plot plot; public ML(Plot p) { plot = p; } public void mousePressed(MouseEvent e){ plot.x=e.getX(); plot.y=e.getY(); plot.repaint(); } } public class P24 { public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater( new Runnable() { public void run() { JFrame f = new JFrame("P24"); f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); Container c = f.getContentPane(); Plot p = new Plot(); c.add(p); 8 Programowanie GUI – Wykład 9 p.addMouseListener(new ML(p)); f.setSize(300,200); f.setVisible(true); } } ); } } 1.4 Standardowe okna dialogowe • klasa JOptionPane – proste okna dialogowe JOptionPane.showMessageDialog(frame, "Important message."); JOptionPane.showMessageDialog(frame, "Shutting down...", "Error", JOptionPane.ERROR_MESSAGE); • klasa JFileChooser – okno wyboru plików JFileChooser fc = new JFileChooser(); int r = fc.showOpenDialog(frame); if (r == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); 9 Programowanie GUI – Wykład 9 JOptionPane.showMessageDialog(frame, "[ " + file.getName() + " ]"); } 1.5 Wybrane środowiska programistyczne ? Sun netBeans i oparte na nim Java Studio 10 Programowanie GUI – Wykład 9 Przykład tworzenia programu: 11 Programowanie GUI – Wykład 9 12 Programowanie GUI – Wykład 9 13 Programowanie GUI – Wykład 9 14 Programowanie GUI – Wykład 9 15 Programowanie GUI – Wykład 9 ? Borland JBuilder ? IBM WebSphere (oparty na projekcie Eclipse) 16 Programowanie GUI – Wykład 9 17 Programowanie GUI – Wykład 9 ? Oracle JDeveloper ? Xinox JCreator 18