610 likes | 699 Views
Nyílt Fejlesztőrendszerek Felhasználói felületek. Házi feladat. Feladat Eclipse plugin készítés Témalista a weben – jövő héten Nehézségtől függő értékelés Csapatmunka lehetséges (2-3 főig, behatárolt részfeladatok!) Ütemezés 4. hét vége: pontos specifikáció Utolsó tanítási hét: beadás
E N D
Házi feladat • Feladat • Eclipse plugin készítés • Témalista a weben – jövő héten • Nehézségtől függő értékelés • Csapatmunka lehetséges (2-3 főig, behatárolt részfeladatok!) • Ütemezés • 4. hét vége: pontos specifikáció • Utolsó tanítási hét: beadás • Vizsgaidőszakban nincs házi feladat beadás!!!
Java-alapú felhasználói felület • AWT (Abstract Widgeting Toolkit) • Az első • Alacsony szintű elemek • Egyszerű esemény modell (event-listener) • Már elavult (SUN)
Java-alapú felhasználói felület • Swing • „AWT magasabb szinten” • Komplex GUI elemek • Összetettebb esemény modell, többszálúság • Ma ez a javasolt (általában - SUN) • Java-ban megírt komponensek
Java-alapú felhasználói felület • AWT, Swing hátrányok • Lassú • „nem úgy néz ki, mint a Word” probléma • Nem veszi át a WM look-and-feel beállításait • Általában a nyelvi beállításokat sem (feltétlenül) • „Nem szép” (felhasználói élmény) • Jelentős mennyiségű erőforrást (memória) emészt fel (Swing) • Alacsony szintű (AWT)
Java-alapú felhasználói felület • SWT – Standard Widgeting Toolkit • A Swing helyett… • Az Eclipse projekt indulásakor kezdték fejleszteni • Előzmény: natív GUI komponensek elérése Smalltalk alól (OTI) • Cél: gyors, natív elemekből épített GUI keretrendszer
Java-alapú felhasználói felület • SWT • Natív • A platform API-t használja • Minden platformra portolni kell • Gyors • Azonos look-and-feel a többi (natív) alkalmazással • OLE, Drag-n-drop,… támogatás • kis különbségek a platformok között lehetnek
Java-alapú felhasználói felület • SWT • Átgondolt struktúra • Egyszerű komponensek • Hierarchikus szerkezetek • Átlátható esemény-kezelés • Átlátható API • Bővíthető • Saját widget-ek (nem natív) • Optimális funkció-teljesítmény arány érhető el
Java-alapú felhasználói felület • SWT alapelemek • Display • Egy „munkaállomást reprezentál” (monitor(ok), egér, billentyűzet) • Az esemény-szétosztásért felel • Tartalmazza a felső szintű Shell és Monitor objektumokat • Shell • Egy „ablak”-ot reprezentál • Composite-ek és Control-ok hierarchiájának a gyökere
Java-alapú felhasználói felület • SWT alapelemek • Composite • Olyan elem, mely más elemeket (composite, control) tartalmazhat (konténer) • Control • Egy operációs rendszer szintű vezérlőt reprezentál • Button, Label, … • A Shell és Composite is ez • Az összes osztály a Widget osztályból származik
Java-alapú felhasználói felület • SWT alapelemek • Esemény-hurok • Explicit – az alkalmazásban le kell kódolni • Egy ciklusban olvassuk a bejövő eseményeket, és feldolgozzuk őket • Ha az alkalmazás véget ér (a főablak bezárásra kerül) abbahagyhatjuk • Az idősebbeknek: Windows API programozás
Java-alapú felhasználói felület • SWT alapelemek • Esemény-hurok while(!shell.isDisposed()){ if(!display.readAndDispatch()) display.sleep (); }
SWT események • Mi is az esemény? • Minden történés, ami érdekes lehet • A felhasználó vagy az operációs rendszer generálja • A listenerek kapják el az eseményeket • Kétféle listener • Típus nélküli • Típusos
SWT események • Típus nélküli listener • addListener(int, Listener) • A típus adja meg a szűrőt • Csak az ennek megfelelő események továbbítódnak • Listener • handleEvent(Event) • notifyListeners(int, Event) • Programozott esemény-küldés
SWT események • Típusos listener • addXYZListener(XYZListener) • Csak addot típusú listener adható meg • Listener • Specifikus metódusok • Specifikus argumentumokkal • „objektum-orientáltabb…” • Adapter osztályok • Ősosztályként a listenereknek
SWT események • Ha több listenert adunk meg valahol, a megadás sorrendjében hívódnak meg • Ha többször adtuk hozzá ugyanazt, többször hívódik meg • Ha többször adtuk hozzá, többször is kell elvenni
Billentyűzet • „Keyboard focus” – a billentyűleütések célpontja (control) • setFocus() • isFocusControl() • forceFocus() • Események • KeyDown • KeyUp • FocusEvent - FocusListener
Billentyűzet • SWT konstans a speciális karaktereknek • BS, CL, ESC, DEL, LF, TAB • stateMask – különleges gombok állapota • SHIFT, ALT, CTRL, COMMAND • „Traversal key” • Utazás a kontrollok között • A kontroll dönt a feldolgozásról (nem accelatorKey) pl. &File
Billentyűzet • AcceleratorKey – gyorselérés • Kontrollhoz kötjük • setAccelerator(int) • Karakter + módosító maszk • Window Manager rendszer-billentyű események • Pl. Alt+F4 • Az ablakkezelő rendszer „elnyeli” • Nem jut el a programhoz
Egér • Tipikus mutatóeszköz • 1-2-3-sok gomb • Az aktuális pozíciót kurzor jelzi a képernyőn • A kurzor változó alakú • Az alatta levő elemtől (is) függően • Események • Enter, Exit, Down, Up, Move, Hover, DoublClick
Egér • Esemény-elemek • Koordináták – control-relatív • Button – az akcióban résztvevő gomb • Gomb maszk – A stateMask része • BUTTON1, BUTTON2, BUTTON3 • BUTTON_MASK • State maszk – a billentyűzet-infó is!
SWT Hello World 1 import org.eclipse.swt.*; 2 import org.eclipse.swt.graphics.*; 3 import org.eclipse.swt.widgets.*; 4 public class HelloWorld{ 5 public static void main(String[] args) { 6 Display display = new Display(); 7 Shell shell = new Shell(display); 8 shell.setText("Hello, World!"); 9 shell.setSize(200, 100); 10 shell.open (); 11 while (!shell.isDisposed()) { 12 if (!display.readAndDispatch()) 13 display.sleep (); 14 } 15 display.dispose (); 16 } 17}
SWT Hello World 1 import org.eclipse.swt.*; 2 import org.eclipse.swt.graphics.*; 3 import org.eclipse.swt.widgets.*; 4 public class HelloWorld{ 5 public static void main(String[] args) { 6 Display display = new Display(); 7 Shell shell = new Shell(display); 8 shell.setText("Hello, World!"); 9 shell.setSize(200, 100); 10 shell.open (); 11 while (!shell.isDisposed()) { 12 if (!display.readAndDispatch()) 13 display.sleep (); 14 } 15 display.dispose (); 16 } 17} SWT könyvtárak
SWT Hello World 1 import org.eclipse.swt.*; 2 import org.eclipse.swt.graphics.*; 3 import org.eclipse.swt.widgets.*; 4 public class HelloWorld{ 5 public static void main(String[] args) { 6 Display display = new Display(); 7 Shell shell = new Shell(display); 8 shell.setText("Hello, World!"); 9 shell.setSize(200, 100); 10 shell.open (); 11 while (!shell.isDisposed()) { 12 if (!display.readAndDispatch()) 13 display.sleep (); 14 } 15 display.dispose (); 16 } 17} Referencia a képernyőre
SWT Hello World 1 import org.eclipse.swt.*; 2 import org.eclipse.swt.graphics.*; 3 import org.eclipse.swt.widgets.*; 4 public class HelloWorld{ 5 public static void main(String[] args) { 6 Display display = new Display(); 7 Shell shell = new Shell(display); 8 shell.setText("Hello, World!"); 9 shell.setSize(200, 100); 10 shell.open (); 11 while (!shell.isDisposed()) { 12 if (!display.readAndDispatch()) 13 display.sleep (); 14 } 15 display.dispose (); 16 } 17} Új ablak a képernyőn
SWT Hello World 1 import org.eclipse.swt.*; 2 import org.eclipse.swt.graphics.*; 3 import org.eclipse.swt.widgets.*; 4 public class HelloWorld{ 5 public static void main(String[] args) { 6 Display display = new Display(); 7 Shell shell = new Shell(display); 8 shell.setText("Hello, World!"); 9 shell.setSize(200, 100); 10 shell.open (); 11 while (!shell.isDisposed()) { 12 if (!display.readAndDispatch()) 13 display.sleep (); 14 } 15 display.dispose (); 16 } 17} Ablak címe
SWT Hello World 1 import org.eclipse.swt.*; 2 import org.eclipse.swt.graphics.*; 3 import org.eclipse.swt.widgets.*; 4 public class HelloWorld{ 5 public static void main(String[] args) { 6 Display display = new Display(); 7 Shell shell = new Shell(display); 8 shell.setText("Hello, World!"); 9 shell.setSize(200, 100); 10 shell.open (); 11 while (!shell.isDisposed()) { 12 if (!display.readAndDispatch()) 13 display.sleep (); 14 } 15 display.dispose (); 16 } 17} Ablak mérete
SWT Hello World 1 import org.eclipse.swt.*; 2 import org.eclipse.swt.graphics.*; 3 import org.eclipse.swt.widgets.*; 4 public class HelloWorld{ 5 public static void main(String[] args) { 6 Display display = new Display(); 7 Shell shell = new Shell(display); 8 shell.setText("Hello, World!"); 9 shell.setSize(200, 100); 10 shell.open (); 11 while (!shell.isDisposed()) { 12 if (!display.readAndDispatch()) 13 display.sleep (); 14 } 15 display.dispose (); 16 } 17} Ablak megnyitása
SWT Hello World 1 import org.eclipse.swt.*; 2 import org.eclipse.swt.graphics.*; 3 import org.eclipse.swt.widgets.*; 4 public class HelloWorld{ 5 public static void main(String[] args) { 6 Display display = new Display(); 7 Shell shell = new Shell(display); 8 shell.setText("Hello, World!"); 9 shell.setSize(200, 100); 10 shell.open (); 11 while (!shell.isDisposed()) { 12 if (!display.readAndDispatch()) 13 display.sleep (); 14 } 15 display.dispose (); 16 } 17} Esemény-hurok
SWT Hello World 1 import org.eclipse.swt.*; 2 import org.eclipse.swt.graphics.*; 3 import org.eclipse.swt.widgets.*; 4 public class HelloWorld{ 5 public static void main(String[] args) { 6 Display display = new Display(); 7 Shell shell = new Shell(display); 8 shell.setText("Hello, World!"); 9 shell.setSize(200, 100); 10 shell.open (); 11 while (!shell.isDisposed()) { 12 if (!display.readAndDispatch()) 13 display.sleep (); 14 } 15 display.dispose (); 16 } 17} Erőforrások eldobása
SWT architektúra • Platform Interface • Java Native Interface segíségével hívja a platform API-t (c) • Egy-az-egyhez leképzés • Ugyanazon függvényneveket és paramétereket használja, mint a platform • Ugyanazokaz az elnevezési konvenciókat is használja • Minden számottevő részlet már a Java kódban • Aki ismeri az adott platform API-t, egyszerűen portolhatja a SWT-t
SWT Runtime • A futtatáshoz két dolog kell • SWT jar fájlok • Swt.jar – az SWT alap csomagja • Egyéb, platform-függő jar fájlok • A fordításhoz a javac-nak el kell tudni érni ezeket • SWT osztott könyvtárak • Az SWT Platform Interface-t (PI) tartalmazzák • Platform specifikus nevek, pl. swt-XX.dll Windows alatt, vagy libswt-XX.ao Linux alatt • Az egyéb, platform-függő libek halmaza
SWT és Web 2.0 – RAP (Rich Ajax Platform) • SWT-szerű widget-ek webre • Aszinkron működés (AJAX) • Előnyök • Könnyű portolás SWT-ről • Nem-GUI komponensek 1-1 felhasználhatóak • „több-ablak” kezelés • Magas szintű szolgáltatások automatikusan rendelkezésre állnak • Inkubációs fázisban • http://eclipse.org/rap
SWT és Web 2.0 – RAP (Rich Ajax Platform) publicvoid createControl(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(new GridLayout(1, true)); new Label(composite, SWT.LEFT).setText("Do you have complaints?"); Composite yesNo = new Composite(composite, SWT.NONE); yesNo.setLayout(new FillLayout(SWT.VERTICAL)); yes = new Button(yesNo, SWT.RADIO); yes.setText("Yes"); yes.addSelectionListener(new SelectionAdapter() { publicvoid widgetSelected(SelectionEvent e) { setPageComplete(true); setErrorMessage(null); } }); no = new Button(yesNo, SWT.RADIO); no.setText("No"); no.addSelectionListener(new SelectionAdapter() { publicvoid widgetSelected(SelectionEvent e) { setPageComplete(true); setErrorMessage(null); } }); setControl(composite); }
SWT Belülről – Az SWT osztály • Minden SWT konstans • SWT.PUSH, SWT.RADIO • SWT.Selection • Fontos metódusok • getPlatform() • getVersion() • error() • Megjegyzés • Platform – string (pl. „win32”, „gtk”) • Verzió – int
SWT Belülről – Az SWT hibák • Háromféle kivétel • SWTError – kritikus, végzetes hiba • Code – az SWT hibakód • Throwable – a kivétel, ami a hibát okozta • getMessage() – a hiba szöveges leírása • SWTException • Akkor dobja, ha kevésbé kritikus hiba történt • Ugyanazok a mezők, mint fent • IllegalArgumentException • Hibás bemenő paraméter esetén
Widget konstruktorok • Widgeteknek mindig van szülőjük • Tipikus konstruktor: Widget(parent,style) • Stílusok az SWT konstansok kombinációi (bitszintű vagy) • Példák • new Label(shell,SWT.NONE); • Button push = new Button(shell,SWT.PUSH); • Button radio = new Button(shell,SWT.RADIO); • Kivétel: shell szülője shell vagy display
Widget • Minden UI osztály közös absztrakt őse • Konstruktorral példányosítjuk (nem factory) • Létrehozáskor az OS erőforrások lefoglalódnak • Törlés programozottan (dispose) vagy felhasználói művelet során • Elengedi az OS erőforrásokat • Alkalmazás-specifikus adatokat lehet tárolni benne: getData()/setData()
Widget - adattag • setData(Object) – getData() • Egyetlen objektum tárolása • setData(String,Object) – getData(String) • Kulcs-érték párok tárolása • Sok érték esetén lassú (memória-optimalizált) • Kitűnően alkalmazható az MVC patternbeli model felé történő referencia tárolására • Egyszerűbb programozás
Elemek törlése • Az erőforrás-alapú elemeket explicit módon meg kell semmisíteni • Ilyenek: Widgetek, Color, Cursor, Font, GC, Image, Region, Device, … • 1. SZABÁLY: Te csináltad, te semmi-síted meg! • A programozó semmisíti meg: • Font font = new Font(…); • A programozó nem semmisítheti meg! • Font font = control.getFont();
Elemek törlése • 2. SZABÁLY: Egy elem megsemmi-sítése, megsemmisíti a gyerekeit is! • shell.dispose() – az ablak minden eleme • menu.dispose() – a menü minden eleme • tree.dispose() – a fa minden eleme megsemmisül • Fontos: • Control.dispose() és • menuItem.dispose() esetén • A beállított (setMenu()) menü is törlődik!
Control • Ősosztály minden „nehézsúlyú” UI elemnek • Stílusok • BORDER, LEFT_TO_RIGHT, RIGHT_TO_LEFT • Események • FocusIn, FocusOut, KeyDown, KeyUp, Traverse, MouseDown, MouseUp, MouseDoubleClick, MouseEnter, MouseExit, MouseMove, Move, Resize, Paint, Help
Shell – Az ablak • New Shell(display, SWT.SHELL_TRIM); • New Shell(shell, SWT.DIALOG_TRIM); • Stílusok • BORDER, CLOSE, MIN, MAX, NO_TRIM, RESIZE, TITLE, APPLICATION_MODAL, MODELESS, PRIMARY_MODAL, SYSTEM_MODAL • Események • Activate, Close, Iconify, DeIconify, Deactivate
Shell – Az ablak • New Shell(display, SWT.SHELL_TRIM); • New Shell(shell, SWT.DIALOG_TRIM); • Stílusok • BORDER, CLOSE, MIN, MAX, NO_TRIM, RESIZE, TITLE, APPLICATION_MODAL, MODELESS, PRIMARY_MODAL, SYSTEM_MODAL • Események • Activate, Close, Iconify, DeIconify, Deactivate
Shell – Az ablak • Metódusok • open() • close() • setActive() • Megjegyzés • A legfelső ablak szülője a display • Dialógusok szülője a felsőbb szintű ablak
Label • New Label(parent, SWT.NONE); • Statikus szöveg vagy kép megjelenítése • Stílusok • WRAP, LEFT, CENTER, RIGHT, SEPARATOR, HORIZONTAL, VERTICAL, SHADOW_IN, SHADOW_OUT • Fontos metódusok • setText(String) • setImage(Image) • setAlignment(Left |Center | Right)
Button • New Button(parent, SWT.PUSH); • Többféle gomb megjelenítése • Stílusok • ARROW, CHECK, PUSH, RADIO, TOGGLE, FLAT, UP, DOWN, LEFT, CENTER, RIGHT • Események • Kiválasztás