Přednáška 2 Grafické rozhraní Grafické rozhraní GUI (Graphics User Interface) nezávislé na zařízení nezávislé na OS (s ohledem na multiplatformnost progr. j. Java) Komponenty (vizuální i nevizuální) 2 rozhraní AWT (Abstract Window Toolkit) Úvod do tvorby GUI aplikací malá rychlost komponenty závislé na prostředí JFC (Java Foundation Class) Java Beans (nevizuální komponenty) Swing (vizuální komponenty) To nás bude zajímat 1 Přednáška 2 2 Princip GUI aplikace Komponenty Komunikace mezi komponentami Událostmi řízené programování Události Smyčka obsluhující frontu zpráv (událostí, většinou vyvolaných zásahem uživatele) Obslužné kódy událostí (handlery) Problematika vláken a vícevláknových aplikací Asynchronní programování, lze použít i obecně (ne jen pro GUI aplikace) Základní pravidla pro návrh GUI Intuitivní ovládání Dodržování běžných zvyklostí uživatelů dle povahy aplikace dle zkušenosti uživatele dle zvyklostí v jednotlivých OS Prostředí se přizpůsobuje uživateli (ne naopak) Jednotný vzhled aplikací v balíku Použití vhodných rozvržení Jednoduše, přehledně, efektivně, střídmě (barvy, fonty, rozměry) Uživatel musí mít stále přehled, kde se nachází (u více otevřených formulářů) Často je hodnocení aplikace založeno (nesprávně) jen na kvalitě vzhledu Přednáška 2 3 Přednáška 2 4
Základní komponenty Hierarchie komponent v aplikaci java.awt.container javax.swing.jcomponent Většina používaných komponent Top-Level componenty (JFrame, JDialog) Kontejnerové komponenty (JPanel, JScrollPane, JToolbar, JSplitPane, ) Základní komponenty (listy) Swing Controls (JButton, JLabel, JRadioButton, JCheckBox, JTextArea, JTextField, JScrollBar, JComboBox, JMenu, JList, JProgressBar ) Interaktivní (editovatelné) komponenty Informativní (needitovatelné) komponenty Přednáška 2 5 Přednáška 2 6 Vzhled komponent Zobrazení okna statická třída UIManager UIManager.setLookAndFeel (UIManager.getSystemLookAndFeelClassName()); UIManager.setLookAndFeel (UIManager.getCrossPlatformLookAndFeelClassName()); Použití před zobrazením formuláře import java.awt.flowlayout; import javax.swing.jbutton; import javax.swing.jframe; public class MainFrame extends JFrame { JButton btn1, btn2; MainFrame () { settitle("příklad zobrazení okna"); setlayout(new FlowLayout()); btn1 = new JButton("Tlačítko 1"); add(btn1); btn2 = new JButton("Tlačítko 2"); add(btn2); Poznámky: Nastavení zobrazení může být v konstruktoru Aplikace funguje, ale nic nedělá Na rozmístění tlačítek má vliv použitý Layout Bez Layoutu bude druhé tlačítko přes celé okno setsize(300,100); public static void main (String[] args) { new MainFrame().setVisible(true); Komponenty lze přidávat i pomocí getcontentpane().add(button1); Možnost přizpůsobení velikosti okna obsahu pomocí pack(); Přednáška 2 7 Přednáška 2 8
Reakce na událost public class MainFrame extends JFrame { JButton btnpocitadlo; JLabel jlabelpocetstisknuti; static int pocitadlo = 0; MainFrame () { btnpocitadlo = new JButton("Zvyš stav počítadla"); add(btnpocitadlo); jlabelpocetstisknuti = new JLabel("Stav počítadla: 0"); btnpocitadlo.add(new () { public void (ActionEvent e) { buttonpocitadloactionperformed(e); ); add(jlabelpocetstisknuti); Princip fungování konceptu událostí Události vytváří (vysílá) uživatel (prostřednictvím ovládací komponenty) program systém Z hlediska programování je to objekt Jiný objekt je zachycuje (posluchač, listener) Zachycovat může pouze objekt s implementovaným rozhraním Listener, kterého si vysílající objekt zaregistruje private void buttonpocitadloactionperformed(actionevent e) { pocitadlo++; jlabelpocetstisknuti.settext("stav počítadla: " + pocitadlo); Přednáška 2 9 Přednáška 2 10 Jiný způsob implementace rozhraní Události, rozhraní a metody (1) public class MainFrame extends JFrame implements { JButton btnpocitadlo; JLabel jlabelpocetstisknuti; static int pocitadlo = 0; MainFrame () {... btnpocitadlo = new JButton("Zvyš stav počítadla"); btnpocitadlo.add(this); add(btnpocitadlo); jlabelpocetstisknuti = new JLabel("Stav počítadla: 0"); add(jlabelpocetstisknuti);. public void (ActionEvent e) { pocitadlo++; jlabelpocetstisknuti.settext("stav počítadla: " + pocitadlo); Implicitní akce Událost ActionEvent Rozhraní () Změna stavu komponenty Událost ComponentEvent Rozhraní ComponentListener componenthidden() componentmoved() componentresized() componentshown() Změna zaměření komponenty Událost FocusEvent Rozhraní FocusListener focusgained() focuslost() Změna stavu okna Událost WindowEvent Rozhraní WindowListener windowactivated() windowclosed() windowclosing() windowdeactivated() windowopened() Změna zaměření okna Událost WindowFocusEvent Rozhraní WindowFocusListener windowfocusgained() windowfocuslost() Přednáška 2 11 Přednáška 2 12
Události, rozhraní a metody (2) Ukončení programu 1 Práce s klávesnicí Událost KeyEvent Rozhraní KeyListener keypressed() keyreleased() keytyped() Práce s tlačítky myši Událost MouseEvent Rozhraní MouseListener mouseclicked() mouseentered() mouseexited() mousepressed() mousereleased() Pohyb myši Událost MouseMotionEvent Rozhraní MouseMotionListener mousemotiondragged() mousemotionmoved() Práce s rolovacím kolečkem myši Událost MouseWheelEvent Rozhraní MouseWheelListener mousewheelmoved() btnkonec = new JButton("Konec"); btnkonec.add((){ public void (ActionEvent e) { buttonkonecactionperformed(e); ); private void buttonkonecactionperformed(actionevent e) { if (JOptionPane.showConfirmDialog(this, "Zprava", "Dotaz", 0)==0) dispose(); Poznámky: dispose() skryje okno a uvolní jeho zdroje, funguje pro hlavní a jediné okno aplikace System.exit(0); //správné řešení Přednáška 2 13 Přednáška 2 14 Ukončení programu 2 Fokus a viditelnost Použití Adaptéru pro zaregistrování posluchače není potřeba implementovat všechny metody rozhraní adaptér je již obsahuje, mají prázdné tělo implementuje se pouze požadovaná metoda addwindowlistener(new WindowAdapter() { public void windowclosing (WindowEvent e) { System.exit(0); ); Klasické chování okna zjistí v konstruktoru setdefaultcloseoperation(exit_on_close); nebo v návrháři nastavení vlastnosti DefaultCloseOperation. setvisible (boolean b) po vytvoření okna pro komponenty se o viditelnost stará rodičovská komponenta (kontejner) boolean isvisible () setenabled (boolean b) boolean isenabled () Fokus vlastnost komponenty přijímat vstup od uživatele aktivní komponenta void requestfocus() chování závisí na prostředí OS boolean requestfocusinwindow() boolean isfocusowner() Přednáška 2 15 Přednáška 2 16
Metrika komponent Udávána v pixelech Souřadnice levého horního rohu = [0, 0] [0, 0] [width-1, height-1] x height Rozložení komponent layout manager Správce umístění stará se o rozmístění komponent na rodičovském kontejneru Poloha: Point (int x, int y) setlocation(point p); setlocation(int x, int y); Velikost: Dimension (int width, int heigh) setsize (Dimension d); setsize (int width, int height); Pravoúhlá oblast: Rectangle (int x, int y, int width, int height) SetBounds (Rectangle r); SetBounds (int x, int y, int width, int height); y width java.awt.layoutmanager FloatLayout GridLayout BorderLayout GridBagLayout CardLayout GroupLayout (Free Design) Přednáška 2 17 Přednáška 2 18 Layout manager GroupLayout Nastavení zvoleného rozložení z prostředí Využívání při návrhu z IDE inteligentní zarovnávání přichytávání možnost nastavení škálovatelných komponent kódem setlayout(new BorderLayout()); add(new Button ("OK"), BorderLayout.CENTER); add(new Button ("1"), BorderLayout.WEST; add(new Button ("2"), BorderLayout.EAST); setlayout (new FlowLayout(FlowLayout.CENTER, 5, 5)); setlayout (new FlowLayout()); Přednáška 2 19 Přednáška 2 20
Prostředí NetBeans Přehled společných vlastností komponent Color background, Color foreground Font font String text float alignmentx, float alignmenty int verticalalignment, int horizontalalignment Point location int x, int y Size size int width, int height boolean enabled boolean visible String name... Přednáška 2 21 Přednáška 2 22 JLabel JButton Komponenta pro statické zobrazení textu a/nebo obrázku (ikony) Možnost zarovnání: LEFT, RIGHT, CENTER, LEADING, TRAILING Nastavení barvy pozadí (background) a textu (foreground) Konstruktory JLabel () JLabel (String text); JLabel (String text, int alignment); JLabel (Icon i); JLabel (Icon i, int alignment); JLabel (String text, Icon i, int alignment); Metody Nejpoužívanější komponenta, běžně pro spouštění akcí Označení textem a/nebo obrázku, možnost zarovnání, nastavení barvy, ohraničení (border) JButton (String text); JButton (Icon i); JButton (String text, Icon i); int getverticalalignment (); setverticalalignment (int alignment); int getverticalalignment (); setverticalalignment (int alignment); int gethorizontalalignment (); sethorizontalalignment (int alignment); Vybrené rozhraní a metody ItemListener itemstatechanged() Přednáška 2 23 Přednáška 2 24
JCheckBox Zaškrtávací pole, logická vlastnost selected (true/false), Označení textem a/nebo obrázku, možnost zarovnání, nastavení barvy, ohraničení (border) JRadioButton Přepínač, obdoba checkboxu, logická vlastnost selected (true/false), Může fungovat samostatně nebo ve skupině (pouze jeden přepínač ve skupině může být zaškrtnutý) JCheckBox (String text); JCheckBox (String text, boolean selected); + varianty s Icon JRadioButton (String text); JRadioButton (String text, boolean selected); + varianty s Icon boolean isselected (); setselected (boolean selected) boolean isselected (); setselected (boolean selected); ItemListener itemstatechanged ItemListener itemstatechanged Přednáška 2 25 Přednáška 2 26 ButtonGroup JTextField Slouží pro sdružení přepínačů (radiobutton) do skupiny ButtonGroup (); remove (AbstractButton button); add (AbstractButton button); ButtonModel getselection (); setselected (ButtonModel bm, boolean state); Enumeration <AbstractButton> getelements (); int getbuttoncount (); boolean isselected (ButtonModel bm); Jednořádkový textový vstup, ukončení zadávání klávesou ENTER Možnost nastavení pouze pro čtení, barvy pozadí, barvy textu, použitého fontu, ohraničení, vyznačení části textu, Délka zadávaného textu nesouvisí se šířkou editačního pole JTextField (); JTextField (String text); boolean geteditable(); seteditable (boolean editable) FocusListener focusgained(), focuslost() KeyListener keypressed(), KeyReleased(), keytyped() Přednáška 2 27 Přednáška 2 28
JTextArea JComboBox Víceřádkové zobrazení editovatelného textu, slouží pro vstup i výstup Obsah uložen jako String Použití posuvníků Formátování obsahu do řádků (vložení znaku \n do textu), volitelné zalamování JTextArea (); JTextArea (String text); JTextArea (String text, int rows, int columns); settext (String s); String gettext (); append (String str); insert (String strm int pos); seteditable (boolean editable), boolean iseditable (); setcolumns (int columns); int getcolumns (); setraws (int raws); int getraws (); setlinewrap (boolean wrap); boolean getlinewrap (); setwrapstyleword (boolean word); boolean getwrapstyleword (); Přednáška 2 29 Kombinace editačního boxu a rozbalovacího seznamu Možnost přidávání položek za běhu programu, možnost modifikace vlastní položky Položky jsou objekty s metodou tostring(), přístup přes indexy JComboBox (); JComboBox (Object[] items); JComboBox (ComboBoxModel amodel); additem (Object obj); insertitemat (Object obj, int index); removeitemat (int index); Object getitemat (int index); int getitemcount (); int getselectedindex (); Object getslecteditem (); setselectedindex (int index), int getitemcount (); boolean iseditable (); seteditable (boolean editable) FocusListener focusgained(), focuslost() Přednáška 2 30 JList Víceřádkový seznam s trvalým rozbalením (zobrazení) Dle počtu položek je použit posuvník Možnost výběru pouze jedné položky, souvislého intervalu nebo více položek Práce s položkami (inicializace, přidávání, odebírání, modifikace) pomocí DefaultListModel JList (); JList (Object[] listdata); JList (ListModel datamodel); getmodel.add (int pos, String str); getmodel.set (int pos, String str); getmodel.remove (int pos); getmodel.clear (); int getmodel.getsize (); setselectedmode (int selsctionmode); setselectedindex (int index); setselectedindices (int indices); int getselectedindex (); int [] getselectedindices (); boolean isselectionempty (); clearselection (); ListSectionMode: SINGLE_SELECTION, SINGLE_INTERVAL_SELECTION, MULTIPLE_INTERVAL_SELECTION JPanel Kontejner pro vkládání dalších komponent (dle nastaveného layout manageru) Barva pozadí, okraje, použití DoubleBufferingu Vhodný pro kreslení JPanel (); JPanel (boolean isdoublebuffered); JPanel (LayoutManager layout); JPanel (LayoutManager layout, boolean isdoublebuffered); add (Component comp); remove (Component comp); getcomponent setborder (Border border); // NoBorder, BevelBorder, EtchedBorder, LineBorder, TitledBorder, boolean isdoublebuffered (); setdoublebuffered (boolean doublebuff); boolean isfocusable (); mouseclicked, mouseentered, mouseexited, MouseListener mousepressed,mousereleased MouseMotionListener mousemotiondragged, mousemotionmoved Přednáška 2 31 Přednáška 2 32