„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:
#ÁTIRÁNYÍTÁS [[2. Java ablakkezelés, Swing összefoglaló (2012)]]
+
__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&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 2012. december 17., 20:26-kori változata

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)