Interfejs graczny w Javie.

Podobne dokumenty
Kurs programowania. Wykład 4. Wojciech Macyna. 23 marca 2016

Java jako zdalny interfejs aplikacji Webowych aplety

Programowanie graficznych interfejsów użytkownika

Podstawy Języka Java

Java - interfejs graficzny

Programowanie w języku Java WYKŁAD

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

SWING. dr Jarosław Skaruz

Java biblioteka Swing

Kontenery i komponenty graficzne

Programowanie zdarzeniowe

setdefaultcloseoperation(jframe.exit_on_close);//obsługa zamykania aplikacji setvisible(true); } //wyświetlenie okna

Języki Programowania II Wykład 7. Java Swing

Marcin Luckner Warsaw University of Technology Faculty of Mathematics and Information Science

Podstawowe informacje o apletach

Obsługa zdarzeń. Wykład 4

Informatyka i Ekonometria Programowanie komputerów Ćwiczenia Tworzenie aplikacji wykorzystaniem graficznego interfejsu użytkownika - Swing.

Tworzenie i obsługa graficznego interfejsu uŝytkownika

Java SE Laboratorium nr 5. Temat: Obsługa zdarzeń

Kurs programowania. Wykład 5. Wojciech Macyna. 31 marzec 2016

Tworzenie elementów graficznych

Klasy abstrakcyjne. Klasę abstrakcyjną tworzymy przy pomocy modyfikatora abstract

Programowanie graficznych interfejsów uŝytkownika

Programowanie obiektowe

Język JAVA podstawy. Wykład 5, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programowanie zdarzeniowe

Programowanie obiektowe

Programowanie w Javie Wykład 6 Okienka w Javie (AWT)

Wykład 12: Obsługa Zdarzeń

Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com

Programowanie Multimediów. Programowanie Multimediów JAVA. programowanie GUI. (AWT i Swing) [1]

Informatyka I. Interfejs GUI wysokiego poziomu. Biblioteka Swing. Programowanie zdarzeniowe. Politechnika Warszawska Wydział Transportu 2018

Języki i metody programowania Java Obsługa zdarzeń - przykłady

Scenariusz Lekcji. Część organizacyjna:

Programowanie zdarzeniowe

Java Foundation Clases. Tworzenie graficznych interfejsów użytkownika (GUI) w Javie

Interaktywne aplety obsługa zdarzeń, uruchamianie apletu przez przeglądarkę lub maszynę wirtualną Javy. Tworzenie łącz w apletach

Java niezbędnik programisty spotkanie nr 12. Graficzny interfejs użytkownika

Grafika i komunikacja człowiek komputer Laboratorium. Część 1: Wstęp do grafiki

Wykład 3: Projektowanie graficznych interfejsów użytkownika w Java

SWING ZAGADNIENIA: wprowadzenie, kontenery I komponenty, LayoutManager, komponenty tekstowe.

Aplikacja wielowątkowa prosty komunikator

POLIMORFIZM, INTERFEJSY, PROGRAMOWANIE ZDARZENIOWE

JAVA. Strumienie wejścia i wyjścia. Pliki - zapis i odczyt

Pierwsza ramka. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 10

Programowanie graficznego interfejsu użytkownika. Wykład 8. Maciej Wołoszyn 10 maja 2006

SWING c.d. przydatne narzędzia: JFileChooser, JOptionPane. drag'n drop, menu kontekstowe.

Kontynuacja wprowadzenia do SWING. Przykłady implementacji wybranych komponentów

Programowanie w środowisku graficznym- wykład 9 Programowanie GUI cz1

Wykład 4_1. Interaktywne aplety obsługa zdarzeń, uruchamianie apletu przez przeglądarkę lub maszynę wirtualną Javy.

Podstawy Swing. Tomasz Borzyszkowski

Programowanie w języku JAVA. Wykład IV Swing - GUI

Aplikacja wielow tkowa prosty komunikator

Zakład Teoretycznych Podstaw Informatyki Instytut Matematyki i Informatyki Akademia Jana Długosza w Częstochowie

Programowanie obiektowe

Zaawansowane programowanie obiektowe. Wykład 3 część 2

Wzorzec projektowy Obserwator idiomatyczne rozwiązanie

Laboratorium z informatyki sem. III/ćw. 2 Wydział Transportu PW /19 MATERIAŁY POMOCNICZE DO ĆWICZENIA 2

Aplikacje w Javie wykład 12 Programowanie GUI

Rozdział 5 Aplety, grafika w Javie

Graphic User Interfaces pakiet Swing

SWING ZAGADNIENIA: wprowadzenie, kontenery i komponenty, LayoutManager, komponenty tekstowe. inne przydatne komponenty.

Interfejsy w Java. Przetwarzanie równoległe. Wątki.

Obsługa zdarzeń w JAVIE ((ActionListener,ItemListener,TableModelListener))

Programowanie w języku Java

Rysowanie prostych obiektów graficznych przy użyciu biblioteki AWT (Abstract Window Toolkit)

Kurs programowania. Wykład 6. Wojciech Macyna. 7 kwietnia 2016

Ćwiczenia 9 - Swing - część 1

JAVA 2: PROGRAMY Z GRAFICZNYM INTERFEJSEM UŻYTKOWNIKA 1. WSTĘP

JAVA Materiały do laboratorium III wersja niezaawansowana Marcin Borkowski WSEiZ czerwiec 2006

1 Intefejsy graczne. 1.1 Okienka. 1.2 Komponenty

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

9. Swing wprowadzenie

Jakarta POI. POIFS obsługa dokumentów OLE 2, HSSF dokumenty w formacie Excel'a, HWPF proste dokumenty w formacie Word 97,

PROGRAMOWANIE APLIKACJI MULTIMEDIALNYCH

Java Platform Micro Edition

Programowanie obiektowe

Programowanie w języku Java

Połączenia między bazami danych i programem w języku Java część 2

GUI - projektowanie interfejsów cz. II

Henryk Budzisz. materiały przygotowane w ramach projektu ZPORR nr POKL /08-00

Bartosz Jachnik - Kino

Programowanie w języku Java

Tworzymy projekt File->New Project->Java Application, przy czym tym razem odznaczamy create main class

LABORATORIUM 7 Cel: 1_1

Język JAVA podstawy. Wykład 5, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programowanie Multimediów. Programowanie Multimediów JAVA. grafika w JAVA 2D API [1]

Programowanie Obiektowe Java

Zaawansowane aplikacje internetowe - laboratorium Web Services (część 1).

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

Programowanie w środowiskach graficznych. Wykład 2.

Aplikacje w Javie wykład 12 Programowanie GUI

Programowanie Obiektowe Java

Programowanie Obiektowe Java

Język JAVA podstawy. wykład 1, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Dokumentacja do API Javy.

Tworzenie projektu zawierającego aplet w środowisku NetBeans. lab1. Dr inż. Zofia Kruczkiewicz Programowanie aplikacji internetowych

Interfejsy, klasy wewn trzne jako szczególny rodzaj obiektów

Programowanie sieciowe

package pakieta; import pakietb.b; package pakietb; public class B { B(){} public class A { private B b; A(B b) { this.b = b; } }

Transkrypt:

Interfejs graczny w Javie. Robert A. Kªopotek r.klopotek@uksw.edu.pl Wydziaª Matematyczno-Przyrodniczy. Szkoªa Nauk cisªych, UKSW 20.04.2017

Interfejs graczny w Javie Java dostarcza dwóch podstawowych ±rodowisk gracznych do budowania aplikacji okienkowych: AWT i Swing AWT (Abstract Windowing Toolkit) - komponenty s "ci»kie" zale»ne od platformy i u»ywaj zasobów wy±wietlanych przez system operacyjny. Komponenty znajduj si w pakiecie java.awt Swing - komponenty s "lekkie", niezale»ne od platformy. Komponenty znajduj si w pakiecie javax.swing i wspieraj MVC 2 / 47

Wzorzec MVC Gªównie sªu»y do organizowania struktury aplikacji posiadaj cych graczne interfejsy u»ytkownika MVC (Model-View-Controller) - wzorzec projektowy posiadaj cy 3 skªadowe: Model jest pewn reprezentacj problemu b d¹ logiki aplikacji. Widok opisuje, jak wy±wietli pewn cz ± modelu w ramach interfejsu u»ytkownika. Mo»e skªada si z podwidoków odpowiedzialnych za mniejsze cz ±ci interfejsu. Kontroler przyjmuje dane wej±ciowe od u»ytkownika i reaguje na jego poczynania, zarz dzaj c aktualizacje modelu oraz od±wie»enie widoków. 3 / 47

MVC - schemat 4 / 47

Hierarchia AWT 5 / 47

Gªówne kontenery klasa Container - jest to klasa kontenerowa sªu» ca do przetrzymywania innych komponentów takich jak przyciski, pola tekstowe, etykiety itp. klasa Window - kontener, który nie ma ramki i pasków menu. Aby utworzy okno, trzeba u»y ramki (Frame), okna dialogowego (Dialog) lub innego okna. klasa Panel - kontener, który nie zawiera paska tytuªu i pasków menu. Mo»e zawiera inne komponenty, takie jak przycisk, pole tekstowe itd. Klasa Frame - kontener zawieraj cy pasek tytuªu i mo»e mie paski menu. Mo»e zawiera inne skªadniki, takie jak przycisk, pole tekstowe itd. 6 / 47

Gªówne metody klasy Component public void add(component c) public void setsize(int width,int height) public void setlayout(layoutmanager m) public void setvisible(boolean status) public void setbounds(int x, int y, int width, int height) 7 / 47

Gªówne komponenty AWT Button Label TextField, TextArea Checkbox, CheckboxGroup Choice List(int rows, boolean multiplemode) Canvas, Panel MenuItem, Menu, MenuBar [frame.setmenubar(mb)], PopupMenu Scrollbar Dialog Toolkit 8 / 47

Komponenty AWT 9 / 47

Frame i Button - przykªad import java. awt.*; class First extends Frame { First (){ Button b= new Button (" click me " ); b. setbounds (30,100,80,30); add (b ); setsize (300,300); setlayout ( null ); setvisible ( true ); public static void main ( String args []){ First f= new First (); import java. awt.*; class First2 { First2 (){ Frame f= new Frame (); Button b= new Button (" click me " ); b. setbounds (30,50,80,30); f. add (b ); f. setsize (300,300); f. setlayout ( null ); f. setvisible ( true ); public static void main ( String args []){ First2 f= new First2 (); 10 / 47

Frame i Button - Windows vs Mac 11 / 47

Obsªuga zdarze«zdarzenie to zmiana stanu obiektu Zdarzenia to np. naci±niecie przycisku, klikni cie przycisku, przeci ganie mysz itp. Pakiet java.awt.event dostarcza wielu klas zdarze«(event classes) i wielu klas nasªuchiwaczy zdarze«(listener interfaces) Aby obsªu»y zdarzenia nale»y zarejestrowa komponent do nasªuchiwacza zdarze«12 / 47

Klasy zdarze«i interfejsy nasªuchiwaczy Event Classes ActionEvent MouseEvent MouseWheelEvent KeyEvent ItemEvent TextEvent AdjustmentEvent WindowEvent ComponentEvent ContainerEvent FocusEvent Listener Interfaces ActionListener MouseListener/MouseMotionListener MouseWheelListener KeyListener ItemListener TextListener AdjustmentListener WindowListener ComponentListener ContainerListener FocusListener 13 / 47

ActionListener - przykªad import java. awt.*; import java. awt. event.*; class AEvent extends Frame implements ActionListener { TextField tf ; AEvent (){ tf= new TextField (); tf. setbounds (60,50,170,20); Button b= new Button (" click me " ); b. setbounds (100,120,80,30); b. addactionlistener ( this ); add (b ); add ( tf ); setsize (300,300); setlayout ( null ); setvisible ( true ); public void actionperformed ( ActionEvent e ){ tf. settext (" Welcome " ); public static void main ( String args []){ new AEvent (); 14 / 47

WindowListener - przykªad import java. awt.*; import java. awt. event.*; public class First3 { First3 (){ Frame f= new Frame (); Button b= new Button (" click me " ); b. setbounds (30,50,80,30); f. add (b ); f. setsize (300,300); f. setlayout ( null ); f. setvisible ( true ); f. addwindowlistener ( new WindowAdapter (){ public void windowclosing ( WindowEvent we ){ // System. exit (0); dispose (); ); public static void main ( String args []){ First3 f= new First3 (); 15 / 47

Nasªuchiwacze w AWT (1/2) ActionListener - jest powiadamiany, gdy naci±niemy guzik lub opcje menu public abstract void actionperformed(actionevent e); MouseListener - jest powiadamiany, gdy wykonamy akcj myszk public abstract void mouseclicked(mouseevent e); public abstract void mouseentered(mouseevent e); public abstract void mouseexited(mouseevent e); public abstract void mousepressed(mouseevent e); public abstract void mousereleased(mouseevent e); MouseMotionListener - jest powiadamiany, gdy ruszamy lub przeci gamy co± myszk public abstract void mousedragged(mouseevent e); public abstract void mousemoved(mouseevent e); ItemListener - jest powiadamiany, gdy klikniemy w chceckbox public abstract void itemstatechanged(itemevent e); 16 / 47

Nasªuchiwacze w AWT (2/2) KeyListener - jest powiadamiany, gdy zmienimy stan klawiszy public abstract void keypressed(keyevent e); public abstract void keyreleased(keyevent e); public abstract void keytyped(keyevent e); WindowListener - jest powiadamiany, gdy zmienimy stan okna public abstract void windowactivated(windowevent e); public abstract void windowclosed(windowevent e); public abstract void windowclosing(windowevent e); public abstract void windowdeactivated(windowevent e); public abstract void windowdeiconied(windowevent e); public abstract void windowiconied(windowevent e); public abstract void windowopened(windowevent e); 17 / 47

WindowListener i Toolkit - przykªad import java. awt.*; import java. awt. event.*; public class ToolkitExample { public static void main ( String [] args ) { Frame f= new Frame (" ToolkitExample " ); Button b= new Button (" beep " ); b. setbounds (50,100,60,30); f. add (b ); f. setsize (300,300); f. setlayout ( null ); f. setvisible ( true ); b. addactionlistener ( new ActionListener (){ public void actionperformed ( ActionEvent e ){ Toolkit. getdefaulttoolkit (). beep (); ); Toolkit t = Toolkit. getdefaulttoolkit (); System. out. println (" Screen resolution = " + t. getscreenresolution ()); Dimension d = t. getscreensize (); System. out. println (" Screen width = " + d. width ); System. out. println (" Screen height = " + d. height ); 18 / 47

Klasy Adapterów AWT Adapter class WindowAdapter KeyAdapter MouseAdapter MouseMotionAdapter FocusAdapter ComponentAdapter ContainerAdapter HierarchyBoundsAdapter Listener interface WindowListener KeyListener MouseListener MouseMotionListener FocusListener ComponentListener ContainerListener HierarchyBoundsListener 19 / 47

MouseMotionAdapter - przykªad import java. awt.*; import java. awt. event.*; public class MouseMotionAdapterExample extends MouseMotionAdapter { Frame f; MouseMotionAdapterExample (){ f= new Frame (" Mouse Motion Adapter " ); f. addmousemotionlistener ( this ); f. setsize (300,300); f. setlayout ( null ); f. setvisible ( true ); public void mousedragged ( MouseEvent e) { Graphics g=f. getgraphics (); g. setcolor ( Color. GREEN ); g. filloval (e. getx (), e. gety (),20,20); public static void main ( String [] args ) { new MouseMotionAdapterExample (); 20 / 47

MouseMotionAdapter Windows 21 / 47

Wy±wietlanie grak - klasa Graphics public abstract void drawstring(string str, int x, int y) public void drawrect(int x, int y, int width, int height) public abstract void llrect(int x, int y, int width, int height) public abstract void drawoval(int x, int y, int width, int height) public abstract void lloval(int x, int y, int width, int height) public abstract void drawline(int x1, int y1, int x2, int y2) public abstract boolean drawimage(image img, int x, int y, ImageObserver observer) public abstract void drawarc(int x, int y, int width, int height, int startangle, int arcangle) public abstract void llarc(int x, int y, int width, int height, int startangle, int arcangle) public abstract void setcolor(color c) public abstract void setfont(font font) 22 / 47

Wy±wietlanie obrazków - drawimage() przykªad import java. awt.*; public class MyCanvas extends Canvas { public void paint ( Graphics g) { Toolkit t= Toolkit. getdefaulttoolkit (); Image i=t. getimage (" loading. gif " ); g. drawimage (i, 120,100, this ); public static void main ( String [] args ) { MyCanvas m= new MyCanvas (); Frame f= new Frame (); f. add (m ); f. setsize (400,400); f. setvisible ( true ); 23 / 47

Wy±wietlanie obrazków - drawimage() Windows 24 / 47

Interfejs graczny w Javie Swing - komponenty s "lekkie", niezale»ne od platformy. Komponenty znajduj si w pakiecie javax.swing i wspieraj MVC. Swing jest cz ±ci Java Foundation Classes (JFC), którego zadaniem jest uproszczenie pisania interfejsu gracznego Swing w caªo±ci jest napisana w Javie, a rysowanie jaj komponentów odbywa si piksel po pikselu Przykªadowe klasy Swing: JButton, JTextField, JTextArea, JRadioButton, JCheckbox, JMenu, JColorChooser. 25 / 47

Hierarchia kontenerów Swing 26 / 47

Hierarchia komponentów Swing 27 / 47

Gªówne komponenty Swing JButton, JLabel JTextField, JTextArea, JPasswordField JCheckBox, JRadioButton, JComboBox JTable, JList JOptionPane - okienka dialogowe Canvas, Panel JMenuItem, JMenu, JMenuBar, JPopupMenu JScrollbar, JProgressBar JTree, JTabbedPane, JSlider, JSpiner JColorChooser, JFileChooser 28 / 47

Komponenty Swing 29 / 47

JFrame i JButton - przykªad import javax. swing.*; public class FirstSwingExample { public static void main ( String [] args ) { JFrame f= new JFrame (); JButton b= new JButton (" click " ); b. setbounds (130,100,100, 40); f. add (b ); f. setsize (400,500); f. setlayout ( null ); f. setvisible ( true ); 30 / 47

JFrame i JButton - Windows vs Mac 31 / 47

Ikona w JButton - przykªad import javax. swing.*; public class JButtonExample { JButtonExample (){ JFrame f= new JFrame (" JButton Example " ); JButton b= new JButton ( new ImageIcon (" button_icon. png " )); b. setbounds (50,50,286, 90); f. add (b ); f. setsize (400,300); f. setlayout ( null ); f. setvisible ( true ); f. setdefaultcloseoperation ( JFrame. EXIT_ON_CLOSE ); public static void main ( String [] args ) { new JButtonExample (); 32 / 47

Ikona w JButton - Windows 33 / 47

JLabel, JTextField i wy±witlanie IP - przykªad import javax. swing.*; import java. awt. event.*; public class LabelExample extends JFrame implements ActionListener { JTextField tf ; JLabel l; JButton b; LabelExample (){ tf= new JTextField (); tf. setbounds (50,50, 150,20); l= new JLabel (); l. setbounds (50,100, 250,20); b= new JButton (" Find IP " ); b. setbounds (50,150,95,30); b. addactionlistener ( this ); add (b ); add ( tf ); add (l ); setsize (400,400); setlayout ( null ); setvisible ( true ); public void actionperformed ( ActionEvent e) { try { String host =tf. gettext (); String ip= java. net. InetAddress. getbyname ( host ). gethostaddress (); l. settext (" IP of "+ host +" is : "+ ip ); catch ( Exception ex ){ System. out. println ( ex ); public static void main ( String [] args ) { new LabelExample (); 34 / 47

Ikona w JButton - Windows 35 / 47

JTable i JScrollPane - przykªad import javax. swing.*; public class TableExample { JFrame f; TableExample (){ f= new JFrame (); String data [][]={ {" 101 "," Amit "," 670000 ", {" 102 "," Jai "," 780000 ", {" 101 "," Sachin "," 700000 " ; String column []={ " ID "," NAME "," SALARY " ; JTable jt= new JTable ( data, column ); jt. setbounds (30,40,200,300); JScrollPane sp= new JScrollPane ( jt ); f. add ( sp ); f. setsize (300,400); f. setvisible ( true ); public static void main ( String [] args ) { new TableExample (); 36 / 47

JTable i JScrollPane - Windows 37 / 47

JOptionPane - przykªad import javax. swing.*; import java. awt. event.*; public class OptionPaneExample extends WindowAdapter { JFrame f; OptionPaneExample (){ f= new JFrame (); f. addwindowlistener ( this ); f. setsize (300, 300); f. setlayout ( null ); f. setvisible ( true ); f. setdefaultcloseoperation ( JFrame. DO_NOTHING_ON_CLOSE ); public void windowclosing ( WindowEvent e) { int a= JOptionPane. showconfirmdialog (f," <html > <i>are </ i> " + " <font color =# ff0000 >you </ font > " + " <u > sure? </u >" ); if ( a== JOptionPane. YES_OPTION ){ f. setdefaultcloseoperation ( JFrame. EXIT_ON_CLOSE ); public static void main ( String [] args ) { new OptionPaneExample (); 38 / 47

Ikona w JButton - Windows 39 / 47

JPasswordField i ToolTip - przykªad import javax. swing.*; public class ToolTipExample { public static void main ( String [] args ) { JFrame f= new JFrame (" Password Field Example " ); JPasswordField value = new JPasswordField (); value. setbounds (100,100,100,30); value. settooltiptext (" Enter your Password " ); JLabel l1 = new JLabel (" Password :" ); l1. setbounds (20,100, 80,30); f. add ( value ); f. add ( l1 ); f. setsize (300,300); f. setlayout ( null ); f. setvisible ( true ); 40 / 47

JPasswordField i ToolTip - Windows 41 / 47

Swing - LayoutManagers LayoutManager - jest u»ywany do uªo»enia komponentów w pewien sposób LayoutManager jest interfejsem implementowanym przez kilka klas: java.awt.borderlayout java.awt.flowlayout java.awt.gridlayout java.awt.cardlayout java.awt.gridbaglayout javax.swing.boxlayout javax.swing.grouplayout javax.swing.scrollpanelayout javax.swing.springlayout 42 / 47

LayoutManagers - Windows 43 / 47

Swing - LookAndFeel Swing obsªuguje tak zwane "pluggable look and feel (plaf)" dla JComponents. "Look" odnosi si do wygl du wid»etów (JComponent); "feel" odnosi si do zachowania wid»etów (na przykªad zachowa«klikni mysz na ró»ne przyciski myszy). "Pluggable" odnosi si do mo»liwo±ci zmiany wygl du i uczucia w czasie wykonywania. Mo»na wybra domy±lny "look and feel" Java lub natywne systemu (Windows, Linux, Mac) lub nowszy Nimbus "look and feel" na wielu platformach 44 / 47

LookAndFeel - Windows 45 / 47

LayoutManager i LookAndFeel - przykªad import java.awt. FlowLayout ; import java.awt. event.*; import javax. swing.*; public class LookAndFeelTest extends JFrame implements ActionListener { final UIManager. LookAndFeelInfo [] infos =UIManager. getinstalledlookandfeels (); LookAndFeelTest (){ for ( UIManager. LookAndFeelInfo info : infos ){ JButton b = new JButton (info. getname ()); b. setactioncommand (info. getclassname ()); b. addactionlistener (this ); add ( b ); settitle ( " Change Look and Feel " ); setdefaultcloseoperation ( WindowConstants. EXIT_ON_CLOSE ); setlayout (new FlowLayout ( FlowLayout. LEADING )); setsize (300,300); setvisible ( true ); public void actionperformed ( ActionEvent e ) { JButton b = ( JButton ) e. getsource (); try { UIManager. setlookandfeel (b. getactioncommand ()); SwingUtilities. updatecomponenttreeui (this ); catch ( Exception ex ) {ex. printstacktrace (); public static void main ( String [] args ) { new LookAndFeelTest (); 46 / 47

47 / 47 Pytania?