java-curs-9
TRANSCRIPT
-
1Structuri de Date n Java (IX)
javax.swing java.awt JComponent Evenimente Containere. MVC Painting. Layout managers Z-ordering Content pane Events i Listeners Adapter
-
2Java Swing
Este un User Interface (UI) toolkit Furnizeaz clase ce reprezint elemente de interfa precum windows, buttons, combo boxes, trees, menus etc. Pachetul folosit este javax.swing Parte din Java Foundation Classes care conine:
Abstract Window Toolkit (AWT), UI original Swing, Java UI toolkit nativ Accesibility 2D API (drawing), Drag and Drop
-
3Pachetul javax.swing
Componente de baz: JApplet JDialog JFrame JWindow
Derivate din JComponent: JLabel, JComboBox, JList, JMenuBar JPanel, JPopupMenu, JScrollBar, JPane JTable, JTree, JProgressBar, JSlider, JToolTip . . .
-
4Abstract Window Toolkit (AWT) Predecesorul lui Swing Aceeai funcionalitate pe toate platformele Folosete elementele de interfa are sistemului pe care ruleaz Implementarea interfeei se bazeaz pe toolkit-uri care fac legtura cu elementele SO underneath Lipsesc elementele UI care nu sunt comune tuturor platformelor (ex. trees, grids)
n Swing, componentele sunt implementate n Java Avantajul c toate controalele Swing arat la fel, indiferent de SO-ul de dedesubt
-
5Crearea UI n Swing
Toate elementele grafice ale UI (buttons, text boxes ..) sunt prefabricate Asamblarea controalelor UI se face prin asamblarea lor n containere ce conin colecii de controale, aranjate n layout-uri complexe Layout manager-ul face aranjarea lor n funcie de dimensiuni, vecinti, n mod automat Tot ceea ce trebuie fcut este indicarea dimensiunilor i ordinii de plasare a componentelor
-
6Componente Orice element de interfa este un JComponent
Ierarhia de derivare: Object (java.lang)
Component (java.awt) Container (java.awt)
JComponent (javax.swing) . . .
AWT i Swing implementeaz ambele elemente de UI Swing - avantaje (controale complexe inexistente n AWT, compatibilitate, paradigma MVC)
-
7nfiare i comportament
nfiare Poziie i mrime Vizibilitate Font i culoare
Comportament Reacia la comenzile utilizatorului
Aciunea utilizatorului expediere obiect eveniment ctre obiectele nregistrate ca listeners
-
8Evenimente
Obiectul UI trimite un ActionEvent Destinatarul se nregistreaz ca listener prin implementarea interfeei ActionListener Ca efect, la activare se apeleaz metoda actionPerformed ()
Categorii: MouseEvent KeyEvent ActionEvent
-
9Containere
Componentele Swing sunt de asemenea containere Componenta informeaz containerul asupra modificrilor de aspect Containerul poate chema de exemplu layout manager-ul pentru rearanjare Containerele permit aranjarea componentelor JComponent fr a cunoate detalii despre ele Flexibilitate sporit n proiectarea UI
-
10
Peers (perechi) AWT realizeaz funcionarea controalelor UI prin implementarea lor cu ajutorul controalelor native Interaciunea ntre AWT i controalele native se face prin peers Fiecare Component AWT are propria peer Look-uri diferite
Swing este lightweight (peer-less) Controalele UI sunt implementate nativ n Java Numai controlul cel mai de jos fereastra interacioneaz cu SO Customizarea look-ului (temei)
-
11
Paradigma Model-View-Controller (MVC)
Principiu de proiectare ce separ Structura / datele, (model) Prezentarea / desenarea (view) i Comportamentul / interaciunea (controller)
unei componente n trei pri de program distincte
ex. checkbox: boolean, desenare, click Event source model Event listener controller JComponent view & controller, model - separat
-
12
Painting Componentele pot fi obligate s se deseneze oricnd (ex. o alt fereastr suprapus dispare) Componenta implementeaz o metod paint () Componenta nu se auto-deseneaz! Decizia se ia de thread-ul (unic) de desenare a UI Componenta poate anuna repaint () Un container invoc desenarea propriilor componentepublic void paint (Graphics g) {
super.paint ();// ...
}
paintComponent () nu deseneaz comp. coninute
-
13
Enabling components
Componentele pot deveni inaccesibile (gri) Metoda setEnabled (true / false)public boolean void actionPerformed (ActionEvent e) { ((JComponent)e.getSource ( )).setEnabled (false);
}
Dezactivarea unui container provoac dezactivarea tuturor componentelor
-
14
Alte metode JComponent
Container getParent () String getName () / void setName (String name) void setVisible (boolean visible) Color getForeground () / void setForeground (Color c) Color getBackground () / void setBackground (Color c) Dimension getSize () / void setSize (int w, int h) getPreferredSize () / setPreferredSize () revalidate () Cursor getCursor () / void setCursor (Cursor c)
-
15
Containers
JComponent este un container Containere aplicaie:
JFrame top level window JWindow fr border, sys menu & buttons JPanel container generic pt. JFrame / JPanel JApplet web browser
Adugarea / tergerea componentelor se face dinamic cu add () / remove ()
-
16
Layout managers
Obiecte care controleaz aezarea i mrimea componentelor n aria de afiare a unui container Oricrui container i se poate schimba layout manager-ul default prin apelul setLayout () Layouts:
JPanel FlowLayout (left-to-right, top-to-bot.) JFrame BorderLayout (location, NORTH ..) GridLayout - matricial GridBagLayout similar tabele HTML
-
17
Z-Ordering
Layout-urile folosite nu permit overlapping-ul componentelor
Dac totui se ajunge n aceast situaie: Ordinea n care au fost adugate n container
dicteaz ordinea de 'stivuire' Ultima introdus este cea mai de jos (mai puin
vizibil) Metoda add() permite specificarea, adiional,
a z-order-ului
-
18
JWindow i JFrame
JFrame este un JWindow ce are title bar, border i se poate redimensiona
-
19
Crearea ferestrei principaleclass SwingTest1 { public static void main (String[] args) { JFrame frame = new JFrame ("Frame"); frame.setSize (300, 300); frame.setLocation (100, 100); JWindow window = new JWindow (); window.setSize (300, 300); window.setLocation (500, 100); frame.setDefaultCloseOperation (
JFrame.EXIT_ON_CLOSE); // frame.setResizable (false); window.setVisible (true); frame.setVisible (true); }}
-
20
Content pane
JWindow i JFrame nu conin direct componente, ci prin intermediul unui content pane getContentPane () este acest container ce acoper suprafaa vizibil Componentele se adaug cu add () la content pane
-
21
Adugarea la content pane
class SwingTest2 { public static void main (String[] args) { JFrame frame = new JFrame ("Frame"); frame.setLocation (100, 100); Container content = frame.getContentPane (); content.setLayout(new FlowLayout ()); content.add (new JLabel ("Kiwi")); content.add (new JButton ("Apple")); frame.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE); frame.pack (); frame.setVisible (true); }}
-
22
Crearea propriului content paneclass SwingTest3 { public static void main (String[] args) { JFrame frame = new JFrame ("Frame"); frame.setLocation (100, 100); Container content = new JPanel (); content.setLayout(new FlowLayout ()); content.add (new JLabel ("Kiwi")); content.add (new JButton ("Apple")); frame.setContentPane (content); frame.setDefaultCloseOperation ( JFrame.EXIT_ON_CLOSE); frame.pack (); frame.setVisible (true); }}
-
23
Events i Listeners
Obiectele Swing comunic prin trimiterea de evenimente Evenimentele nu sunt altceva dect obiecte trimise ca parametru unor metode Evenimentele se trimit unuia sau mai multor listeners Un listener se va nregistra anterior ca fiind capabil s primeasc un anumit tip de eveniment nregistrarea listener-ului se face prin implementarea unei interfee ActionEvent corespunde unei aciuni (click, press Enter..) executate asupra unei componente (oricare) MouseEvent furnizeaz doar informaii despre mouse
-
24
ActionEvent i ActionListener Listener-ul trebuie s implementeze acest interfa:public interface ActionListener
extends java.util.EventListener {public void actionPerformed (ActionEvent e);
}
O surs de ActionEvent-uri precum JButton are implementat posibilitatea de nregistrare / denregistrare a unui listener:
public void addActionListener (ActionListener l) { ... }public void removeActionListener (ActionListener l) { ... }
-
25
Implementarea unui listenerclass SwingTest4 implements ActionListener { public SwingTest (JFrame frame) { JButton button = new JButton ("Mango"); button.addActionListener (this); Container content = frame.getContentPane (); content.setLayout (new FlowLayout ()); content.add (button); } public void actionPerformed (ActionEvent e) { System.out.println ("button pushed: " + e); } public static void main (String[] args) { JFrame frame = new JFrame ("Frame"); frame.setSize (300, 300); SwingTest4 st = new SwingTest4 (frame); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); frame.setVisible (true); }}
-
26
NetBeans 5.0 view
-
27
Tipuri de evenimente Superclasa este java.awt.event.ComponentEvent
java.awt.event.InputEvent java.awt.event.MouseEvent => MouseListener java.awt.event.KeyEvent => KeyListener java.awt.event.ActionEvent => ActionListener
java.awt.InputEvent definete o serie de modificatori pentru detecia Shift, Ctrl, Alt sau tip de buton de mouse apsat [SHIFT | CTRL | META | ALT | BUTTON[1 | 2 | 3]]_MASK
public void mousePressed (MouseEvent e) {int mods = e.getModifiers( );if ((mods & InputEvent.SHIFT_MASK) != 0) {
// buton de mouse apsat concomitent cu Shift}
}
-
28
MVC i adapters
Dac punem att componentele ct i logica programului laolalt, obinem un monolit:
greutate n upgradarea codului construcie alambicat
Prin separarea logicii de partea grafic vom ctiga: claritate separarea conceptelor, deci modificare uoar
Avem nevoie de un adapter pe post de listener mapeaz un eveniment unei metode de procesare
-
29
Implementarea adapter-uluiclass MailMsg { // separm modelul .. String m; public MailMsg (String m) { this.m = m; } public void process (){ System.out.println ("processes mail: " + m); }}
class MailMsgAdapter implements ActionListener { private MailMsg msg; // .. de controller, iar .. public MailMsgAdapter (MailMsg msg) { this.msg = msg; } public void actionPerformed (ActionEvent e) { msg.process (); }}
-
30
GUI cu componenta JButtonclass SwingTest5 { // .. view-ul rmne separat MailMsg msg = new MailMsg ("MSG from Dana"); JButton button = new JButton ("Process"); public SwingTest5 (JFrame frame) { button.addActionListener (new MailMsgAdapter (msg)); Container content = frame.getContentPane (); content.setLayout (new FlowLayout ()); content.add (button); } public static void main(String[] args) { JFrame frame = new JFrame ("Frame"); frame.setSize (300, 300); SwingTest st = new SwingTest (frame); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); frame.setVisible (true); }}
-
31
Dummy adapters
Interfeele listener de regul au multe metode De multe ori nu le implementm pe toate Exist adapters ce definesc metodele empty doar pentru a ne scuti de efortul implementrii Putem deriva din ele n locul interfeei
class MouseAdapter implements MouseListener, ... {public void mouseClicked (MouseEvent e) {};public void mousePressed (MouseEvent e) {};
public void mouseReleased(MouseEvent e) {};public void mouseEntered(MouseEvent e) {};public void mouseExited(MouseEvent e) {};...
}