„Java ablakkezelés, Swing összefoglaló (2012” változatai közötti eltérés

A VIK Wikiből
Ugrás a navigációhoz Ugrás a kereséshez
 
1. sor: 1. sor:
__TOC__
+
#ÁTIRÁNYÍTÁS [[2._Java_ablakkezelés,_Swing_összefoglaló_(2012)]]
 
 
==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&lt; extends AWTKeyStroke&gt; 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 jelenlegi, 2012. december 17., 20:28-kori változata