5. Ablakkezelés
A VIK Wikiből
Ez az oldal a korábbi SCH wikiről lett áthozva.
Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!
Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.
5.1. AWT (Abstract Window Toolkit)
- natív kinézetű, natív implementációjú megjelenítő könyvtár
Container
- konténer elemek:
- Panel
- ScrollPane
- Window
- Frame, stb.
- komponensek megtalálása:
- adott pozíció
- adott sorszám
- listázás
- fókusz továbbadása
- elhelyezés: LayoutManager (Strategy pattern!)
5.2. Eseménykezelés
- public boolean handleEvent, mouseDown, keyDown, action(Event e, ...)
- eseményre meghívja az fenti függvényeket (Observer pattern!)
- ha a visszatérés false, az esemény feljebb gyűrűzik
xxxEventListener, xxxEventAdapter
- xxxEventListener - minden függvényt tartalmazó interfész
- xxxEventAdapter - xxxEventListener megvalósítása üres metódusokkal
5.3. Fókusz-kezelés
- azé a billentyűzet-input, akinél a fókusz van
KeyEventDispatcher interfész
- az implementáló osztály a focus owner előtt elkaphatja az eseményt
- boolean dispatchKeyEvent(KeyEvent e) // továbbadódjon-e
- KeyboardFocusManager-nél kell regisztrálni
KeyEventPostProcessor interfész
- az implementáló osztály a focus owner után elkaphatja az eseményt
- boolean postProcessKeyEvent(KeyEvent e) // továbbadódjon-e
- KeyboardFocusManager-nél kell regisztrálni
WindowEvent, FocusEvent
- fókusz elvesztés/elnyerés sorrendje:
Frame F2-ben K2 komponensre kattintunk K1: FOCUS_LOST // K1 Component elveszti F1: WINDOW_LOST_FOCUS // F1 Frame elveszti F1: WINDOW_DEACTIVATED // F1 Window elveszti F2: WINDOW_ACTIVATED // F2 Window elnyeri F2: WINDOW_GAINED_FOCUS // F2 Frame elnyeri K2: FOCUS_GAINED // K2 Component elnyeri
- lehetséges a fókusz ideiglenes elkérése (scrollbar)
Fókusz továbbadás
- fókuszváltó billentyűk újrakonfigurálása:
- !setFocusTraversalKeys(int id, Set< extends AWTKeyStroke> keystrokes)
- KeyboardFocusManager.XXX_TRAVERSAL_KEYS: FORWARD, BACKWARD, UP_CYCLE
- FocusTraversalPolicy - fókusz továbbadási sorrend definiálása
- Programozott továbbadás
- KeyboardFocusManager: focusNextComponent(Component) // up, down, next, previous
- Component: transferFocus() // up, down, back
- requestFocusInWindow()
5.4. Layout managerek
- az ő feladatuk a Containerben lévő elemek elhelyezése
Container
- setLayout()/getLayout() - layout manager beállítása
- validate() - tartalmazott elemek pozíciójának frissítése
- add() - új elem hozzáadása (adott pozícióra)
LayoutManager
- void layoutContainer(Container parent) - Container layoutjának beállítása
- void addLayoutComponent(String name, Component comp) - új elem hozzáadása
- Dimension maximum/preferred/minimumLayoutSize(Container parent) - méretbeállítás
- float getLayoutAlignmentX/Y(Container target) - X/Y irányú igazítás
- void invalidateLayout(Container target) - elrendezés érvénytelenítése
BorderLayout
- NORTH, SOUTH, EAST, WEST és CENTER elhelyezés
%ATTACHURL%/borderlayout.png
FlowLayout
- sorban egymás mellé
- LEFT, RIGHT, CENTER, LEADING, TRAILING orientációval
%ATTACHURL%/flowlayout.png
CardLayout
- mindig csak a legfelső látszik, lapozhatunk közöttük
GridLayout
- táblázatos, sorok/oszlopok száma rögzíthető
%ATTACHURL%/gridlayout.png
GridBagLayout
- táblázat összevont cellákkal
- GridBagConstraint segít az elrendezésben (gridx/y, gridwidth/height, weightx/y, ipadx/y, insets, fill, anchor)
%ATTACHURL%/gridbaglayout.png
BoxLayout (Swing)
- kb. FlowLayout, csak nem tör a sor végén hanem nyújt
%ATTACHURL%/boxlayout.png
SpringLayout (Swing)
- rugalmas táblázat, formok egyszerű megjelenítésére
%ATTACHURL%/springlayout.png
GroupLayout (Swing)
- egymásba ágyazott csoportok, soros/párhuzamos elhelyezésben
%ATTACHURL%/grouplayout.png
5.5. Swing
- Java-ban megírt, platformfüggetlen
- MVC architektúrát használ
- egyszerű komponensek: +J betű
- AWT-hez hasonló eseménykezelés
JList
- nem méretezhető: JScrollPane-be kell tenni (Decorator pattern!)
- elemeket adó modell lehet: ListModel, Vector, Object[]
ListModel interfész
- Object getElementAt(int index)
- int getSize()
- void add/removeListDataListener(ListDataListener l)
- implementáció pl. DefaultListModel (add/get/remove)
ListDataListener
- modell változásakor meghívott eseménykezelő
- void intervalAdded/Removed(ListDataEvent e)
- void contentsChanged(ListDataEvent e)
JTable
- modellje: TableModel
- görgetéshez JScrollPane kell
TableModel
- változásakor eseményt küld a TableModelListener-eknek
- boolean isCellEditable(int r, int c)
- String getColumnName(int col)
- void get/setValueAt(Object aValue, int rowIndex, int columnIndex)
- int getRow/ColumnCount()
JTree
- modellje: BinTreeModel
BinTreeModel
- változásakor eseményt küld a TreeModelListener-eknek
- public Object getChild(Object parent, int index)
- public Object getRoot()
- public boolean isLeaf(Object node)
- public void insert(double d)
5.6. Drag and Drop
- JComponent.setDragEnabled(boolean b)
- setDropMode(DropMode dm) - elemek közé/elemre/stb. dobja
DataFlavor
- adatformátumokat tárol, ami megjelenhet a drag and drop-ban (és a vágólap és fájrendszerben)
- DataFlavor(Class representationClass, String humanPresentableName)
Transferable
- interfész adatok átvitelére
- Object getTransferData(DataFlavor flavor)
- DataFlavor[] getTransferDataFlavors()
- boolean isDataFlavorSupported(DataFlavor flavor)
TransferHandler
- segítségével testre szabhatjuk a komponens drag&drop viselkedését
- JComponent.setTransferHandler(TransferHandler th)
- int getSourceActions(JComponent): COPY, MOVE, LINK
- Transferable createTransferable(JComponent)
- void exportDone(JComponent c, Transferable t, int action)
- boolean canImport(TransferHandler.TransferSupport ts)
- boolean importData(TransferHandler.TransferSupport ts)
TransferSupport
- segít Drag and Drop lebonyolításában: résztvevő komponensek, adat, stb. tárolása
- Component getComponent()
- int getDropAction()
- int getSourceDropActions()
- DataFlavor[] getDataFlavors()
- boolean isDataFlavorSupported(DataFlavor)
- Transferable getTransferable()
- DropLocation getDropLocation()
5.7. Szálkezelés
- a Swing nem szálbiztos
- alapból egy szálon fut az eseménykezelés és megjelenítés
- SwingUtilities.invokeLater(Runnable r) vagy .invokeAndWait(Runnable r) különszálas GUI építésre
SwingWorker
- új szálként viselkedik, hosszabb számítások esetén hasznos
- visszatérési értéke van
- protected abstract T doInBackground() - elvégzendő munka implementálása
- void execute() - szál indítása
- protected void done() - befejezéskor meghívódik
- T get(long timeout, TimeUnit unit) - visszatérési érték lekérdezése
- void setProgress(int i) - munka állása százalékban
- void cancel(boolean mayInterruptIfRunning) - futás megszakítása
- protected final void publish(V... chunks) - köztes futási eredményeket küld az eseménykezelő szálnak
- protected void process(List<V> chunks) - átveszi a köztes eredményeket
- public final SwingWorker.StateValue getState():
- PENDING -> indítás előtt
- STARTED -> fut, de még nem állt le
- DONE -> megállt
5.8. Beágyazott
- kevés erőforrás, kicsi memória és CPU
- folyamatos VM futás, nem ragadhatnak be objektumok a memóriába
- listener eseménykezelő nem nyerő, Whiteboard kell (l. tervezési minták)
-- MeszegetoBalazsIstvan - 2008.05.27.
-- Velias - 2009.05.27.