„Java ablakkezelés, Swing összefoglaló (2012)” változatai közötti eltérés
Ugrás a navigációhoz
Ugrás a kereséshez
(Ferrero átnevezte a(z) Java ablakkezelés, Swing összefoglaló (2012 lapot a következő névre: 2. Java ablakkezelés, Swing összefoglaló (2012)) |
|||
1. sor: | 1. sor: | ||
− | + | __TOC__ | |
+ | |||
+ | ==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: pozíció, sorszám, listázás | ||
+ | * fókusz továbbadása | ||
+ | * elhelyezés: LayoutManager (Strategy pattern!) | ||
+ | |||
+ | ==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 | ||
+ | |||
+ | ==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: | ||
+ | |||
+ | <pre> | ||
+ | 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 | ||
+ | </pre> | ||
+ | * 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() | ||
+ | |||
+ | ==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 | ||
+ | [[Fájl:borderlayout.png]] | ||
+ | |||
+ | ===FlowLayout=== | ||
+ | |||
+ | * sorban egymás mellé | ||
+ | * LEFT, RIGHT, CENTER, LEADING, TRAILING orientációval | ||
+ | [[Fájl: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ő | ||
+ | [[Fájl: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) | ||
+ | |||
+ | [[Fájl:gridbaglayout.png]] | ||
+ | |||
+ | ===BoxLayout (Swing)=== | ||
+ | |||
+ | * kb. FlowLayout, csak nem tör a sor végén hanem nyújt | ||
+ | [[Fájl:boxlayout.png]] | ||
+ | |||
+ | ===SpringLayout (Swing)=== | ||
+ | |||
+ | * rugalmas táblázat, formok egyszerű megjelenítésére | ||
+ | [[Fájl:springlayout.png]] | ||
+ | |||
+ | ===GroupLayout (Swing)=== | ||
+ | * egymásba ágyazott csoportok, soros/párhuzamos elhelyezésben | ||
+ | [[Fájl:grouplayout.png]] | ||
+ | |||
+ | ==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) | ||
+ | |||
+ | ==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() | ||
+ | |||
+ | ==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 | ||
+ | |||
+ | ==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. [[OotTervezesiMintak|tervezési minták]]) | ||
+ | |||
+ | -- [[MeszegetoBalazsIstvan|MeszegetoBalazsIstvan]] - 2008.05.27. <br /> | ||
+ | -- [[PallosTamas|Velias]] - 2009.05.27. | ||
+ | --[[Szerkesztő:Ferrero|Szabó Csaba]] ([[Szerkesztővita:Ferrero|vita]]) 2012. december 16., 14:18 (CET) | ||
+ | |||
+ | [[Category:Infoszak]] |
A lap 2012. december 17., 20:26-kori változata
Tartalomjegyzék
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: pozíció, sorszám, listázás
- fókusz továbbadása
- elhelyezés: LayoutManager (Strategy pattern!)
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
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()
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
Hiba a bélyegkép létrehozásakor: Nem lehet a bélyegképet a célhelyre menteni
FlowLayout
- sorban egymás mellé
- LEFT, RIGHT, CENTER, LEADING, TRAILING orientációval
Hiba a bélyegkép létrehozásakor: Nem lehet a bélyegképet a célhelyre menteni
CardLayout
- mindig csak a legfelső látszik, lapozhatunk közöttük
GridLayout
- táblázatos, sorok/oszlopok száma rögzíthető
Hiba a bélyegkép létrehozásakor: Nem lehet a bélyegképet a célhelyre menteni
GridBagLayout
- táblázat összevont cellákkal
- GridBagConstraint segít az elrendezésben (gridx/y, gridwidth/height, weightx/y, ipadx/y, insets, fill, anchor)
Hiba a bélyegkép létrehozásakor: Nem lehet a bélyegképet a célhelyre menteni
BoxLayout (Swing)
- kb. FlowLayout, csak nem tör a sor végén hanem nyújt
Hiba a bélyegkép létrehozásakor: Nem lehet a bélyegképet a célhelyre menteni
SpringLayout (Swing)
- rugalmas táblázat, formok egyszerű megjelenítésére
Hiba a bélyegkép létrehozásakor: Nem lehet a bélyegképet a célhelyre menteni
GroupLayout (Swing)
- egymásba ágyazott csoportok, soros/párhuzamos elhelyezésben
Hiba a bélyegkép létrehozásakor: Nem lehet a bélyegképet a célhelyre menteni
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)
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()
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
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.
--Szabó Csaba (vita) 2012. december 16., 14:18 (CET)