„Java ablakkezelés, Swing összefoglaló (2012)” változatai közötti eltérés
Ferrero átnevezte a(z) Java ablakkezelés, Swing összefoglaló (2012 lapot a következő névre: 2. Java ablakkezelés, Swing összefoglaló (2012) |
a autoedit v2: fájlhivatkozások egységesítése, az új közvetlenül az adott fájlra mutat |
||
| (2 közbenső módosítás, amit egy másik szerkesztő végzett, nincs mutatva) | |||
| 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 | |||
[[File:borderlayout.png]] | |||
===FlowLayout=== | |||
* sorban egymás mellé | |||
* LEFT, RIGHT, CENTER, LEADING, TRAILING orientációval | |||
[[File: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ő | |||
[[File: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) | |||
[[File:gridbaglayout.png]] | |||
===BoxLayout (Swing)=== | |||
* kb. FlowLayout, csak nem tör a sor végén hanem nyújt | |||
[[File:boxlayout.png]] | |||
===SpringLayout (Swing)=== | |||
* rugalmas táblázat, formok egyszerű megjelenítésére | |||
[[File:springlayout.png]] | |||
===GroupLayout (Swing)=== | |||
* egymásba ágyazott csoportok, soros/párhuzamos elhelyezésben | |||
[[File: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]] | |||