5. Ablakkezelés

A VIK Wikiből
A lap korábbi változatát látod, amilyen Unknown user (vitalap) 2012. október 21., 21:43-kor történt szerkesztése után volt. (Új oldal, tartalma: „{{GlobalTemplate|Infoszak|OotAblakkezeles}} __TOC__ ==5.1. AWT (Abstract Window Toolkit)== * natív kinézetű, natív implementációjú megjelenítő könyvtár …”)
(eltér) ← Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)

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.