1 / 86

Nyílt Fejlesztőrendszerek JFace

Nyílt Fejlesztőrendszerek JFace. SWT vs. JFace. SWT natív Alacsony szintű elemkészlet Jól kézben tartható működés Sok kódolás JFace Magas szintű komponensek (SWT-re épít) Jobban automatizált Strukturáltabb szerkezet Könnyebb újrafelhasználás Kevésbé kézben tartható. SWT Hello World.

les
Download Presentation

Nyílt Fejlesztőrendszerek JFace

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Nyílt FejlesztőrendszerekJFace

  2. SWT vs. JFace • SWT • natív • Alacsony szintű elemkészlet • Jól kézben tartható működés • Sok kódolás • JFace • Magas szintű komponensek (SWT-re épít) • Jobban automatizált • Strukturáltabb szerkezet • Könnyebb újrafelhasználás • Kevésbé kézben tartható

  3. 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}

  4. JFace Hello World public class MyApp extends ApplicationWindow { public MyApp() { super(null); } protected Control createContents(Composite parent) { Text helloText = new Text(parent, SWT.CENTER); helloText.setText("Hello JFace world!"); parent.pack(); return parent; } public static void main(String[] args){ MyApp p = new MyApp(); p.setBlockOnOpen(true); p.open(); Display.getCurrent().dispose(); } }

  5. JFace Hello World public class MyApp extends ApplicationWindow { public MyApp() { super(null); } protected Control createContents(Composite parent) { Text helloText = new Text(parent, SWT.CENTER); helloText.setText("Hello JFace world!"); parent.pack(); return parent; } public static void main(String[] args){ MyApp p = new MyApp(); p.setBlockOnOpen(true); p.open(); Display.getCurrent().dispose(); } } ApplicationWindow Alkalmazás-ablak objektum Menu, tooolbar, … kezelése

  6. JFace Hello World public class MyApp extends ApplicationWindow { public MyApp() { super(null); } protected Control createContents(Composite parent) { Text helloText = new Text(parent, SWT.CENTER); helloText.setText("Hello JFace world!"); parent.pack(); return parent; } public static void main(String[] args){ MyApp p = new MyApp(); p.setBlockOnOpen(true); p.open(); Display.getCurrent().dispose(); } } Elemek létrehozása (override)

  7. JFace Hello World public class MyApp extends ApplicationWindow { public MyApp() { super(null); } protected Control createContents(Composite parent) { Text helloText = new Text(parent, SWT.CENTER); helloText.setText("Hello JFace world!"); parent.pack(); return parent; } public static void main(String[] args){ MyApp p = new MyApp(); p.setBlockOnOpen(true); p.open(); Display.getCurrent().dispose(); } } Blokkoló open()

  8. JFace Hello World public class MyApp extends ApplicationWindow { public MyApp() { super(null); } protected Control createContents(Composite parent) { Text helloText = new Text(parent, SWT.CENTER); helloText.setText("Hello JFace world!"); parent.pack(); return parent; } public static void main(String[] args){ MyApp p = new MyApp(); p.setBlockOnOpen(true); p.open(); Display.getCurrent().dispose(); } } Mindenki a Display gyereke, elég ezt törölni

  9. Eseménykezelés • Event-Listener modell helyett • Action-contribution modell • Absztraktabb modell • Több eseményforrás egységes, központi feldolgozása (pl. ablak bezárása több helyről) • 3 alapvetés • A felhasználói akciók gombokat, menüket, toolbarokat érintenek • Minden komponenshez egy eseményt rendelünk • Minden eseményhez egy kezelő lesz

  10. Eseménykezelés • Event-Listener modell helyett • Action-contribution modell • Absztraktabb modell • Több eseményforrás egységes, központi feldolgozása (pl. ablak bezárása több helyről) • 3 alapvetés • A felhasználói akciók gombokat, menüket, toolbarokat érintenek • Minden komponenshez egy eseményt rendelünk • Minden eseményhez egy kezelő lesz

  11. Akciók • Hasonló az event-ekhez • A Display elkapja az OS eseményt, a window Action-né alakítja • A Contribution-hoz kerül, mely meghívja az akció run() metódusát

  12. Contribution • ContributionItem • Akciót eredményező GUI elem • ActionContributionItem • Nincs konkrét megjelenés, a fill() kitöltésétől függ • Ezt használjuk a leggyakrabban

  13. Contribution • ContributionManager • Item-eket fogadó konténer elem • Menu menedzser • Toolbar menedzser

  14. Példa: Action public class MyAction extends Action { StatusLineManager smanager; int trigger = 0; public MyAction(StatusLineManager sm){ super("&Click",AS_PUSH_BUTTON); smanager= sm; setToolTipText("Klikk ide!"); } public void run() { trigger++; smanager.setMessage(trigger+" alkalommal kattintottál."); } }

  15. Példa: Action public class MyAction extends Action { StatusLineManager smanager; int trigger = 0; public MyAction(StatusLineManager sm){ super("&Click",AS_PUSH_BUTTON); smanager= sm; setToolTipText("Klikk ide!"); } public void run() { trigger++; smanager.setMessage(trigger+" alkalommal kattintottál."); } } Az Action osztályból örököltetjük

  16. Példa: Action public class MyAction extends Action { StatusLineManager smanager; int trigger = 0; public MyAction(StatusLineManager sm){ super("&Click",AS_PUSH_BUTTON); smanager= sm; setToolTipText("Klikk ide!"); } public void run() { trigger++; smanager.setMessage(trigger+" alkalommal kattintottál."); } } Megadjuk a szöveget és a kontroll stílusát

  17. Példa: Action public class MyAction extends Action { StatusLineManager smanager; int trigger = 0; public MyAction(StatusLineManager sm){ super("&Click",AS_PUSH_BUTTON); smanager= sm; setToolTipText("Klikk ide!"); } public void run() { trigger++; smanager.setMessage(trigger+" alkalommal kattintottál."); } } Tooltip is megadható (mindenhol érv.)

  18. Példa: Action public class MyAction extends Action { StatusLineManager smanager; int trigger = 0; public MyAction(StatusLineManager sm){ super("&Click",AS_PUSH_BUTTON); smanager= sm; setToolTipText("Klikk ide!"); } public void run() { trigger++; smanager.setMessage(trigger+" alkalommal kattintottál."); } } Az akció végrehajtása

  19. Példa: Action felhasználása public class MyApp extends ApplicationWindow { public MyApp(){ super(null); addStatusLine(); addMenuBar(); addToolBar(SWT.FLAT | SWT.WRAP); } StatusLineManager sline = new StatusLineManager(); MyAction act = new MyAction(sline); ActionContributionItem aci = new ActionContributionItem(act); protected Control createContents(Composite parent) { getShell().setText("Action example"); aci.fill(parent); parent.pack(); return parent;}

  20. Példa: Action felhasználása public class MyApp extends ApplicationWindow { public MyApp(){ super(null); addStatusLine(); addMenuBar(); addToolBar(SWT.FLAT | SWT.WRAP); } StatusLineManager sline = new StatusLineManager(); MyAction act = new MyAction(sline); ActionContributionItem aci = new ActionContributionItem(act); protected Control createContents(Composite parent) { getShell().setText("Action example"); aci.fill(parent); parent.pack(); return parent;} Létrehozunk egy Action példányt

  21. Példa: Action felhasználása public class MyApp extends ApplicationWindow { public MyApp(){ super(null); addStatusLine(); addMenuBar(); addToolBar(SWT.FLAT | SWT.WRAP); } StatusLineManager sline = new StatusLineManager(); MyAction act = new MyAction(sline); ActionContributionItem aci = new ActionContributionItem(act); protected Control createContents(Composite parent) { getShell().setText("Action example"); aci.fill(parent); parent.pack(); return parent;} Az ablakra dobjuk az akciót

  22. Példa: Action felhasználása folyt. protected MenuManager createMenuManager() { MenuManager main_menu = new MenuManager(null); MenuManager action_menu = new MenuManager("Menu"); main_menu.add(action_menu); action_menu.add(act); return main_menu; } protected ToolBarManager createToolBarManager(int style) { ToolBarManager tool_bar_manager = new ToolBarManager(style); tool_bar_manager.add(act); return tool_bar_manager; } protected StatusLineManager createStatusLineManager() { return sline; }

  23. Példa: Action felhasználása folyt. protected MenuManager createMenuManager() { MenuManager main_menu = new MenuManager(null); MenuManager action_menu = new MenuManager("Menu"); main_menu.add(action_menu); action_menu.add(act); return main_menu; } protected ToolBarManager createToolBarManager(int style) { ToolBarManager tool_bar_manager = new ToolBarManager(style); tool_bar_manager.add(act); return tool_bar_manager; } protected StatusLineManager createStatusLineManager() { return sline; } Egy menüt hozunk létre, amibe szintén beledobjuk az Action-t

  24. Példa: Action felhasználása folyt. protected MenuManager createMenuManager() { MenuManager main_menu = new MenuManager(null); MenuManager action_menu = new MenuManager("Menu"); main_menu.add(action_menu); action_menu.add(act); return main_menu; } protected ToolBarManager createToolBarManager(int style) { ToolBarManager tool_bar_manager = new ToolBarManager(style); tool_bar_manager.add(act); return tool_bar_manager; } protected StatusLineManager createStatusLineManager() { return sline; } Hozzáadjuk egy toolbar-hoz is

  25. Action-Contribution • Az akciók és contribution-ök összekötése • A contrib. Manager add() függvénye • add(ActionContributionItem) – explicit item-ként való hozzáadás - csak egyszer! • add(Action) – akció implicit hozzáadása – többször is lehet! • Az Action fill() függvénye segíségével • fill(Composite) – dialógus elem lesz • fill(MenuManager, int) – menü elem lesz (adott pozícióban • fill(ToolBarManager, int) – toolbar elem lesz (Adott pozícióban)

  26. Action – további jellemzők • Alapvető függvények • setText(), setImage(), setTooltipText(), setDescription(), setEnabled()… • Checkbox, radio esetén • setChecked(), isChecked() • Gyorsbilentyűk • setAccelerator(), getAccelerator(), …

  27. Szövegkezelés JFace-szel • IDocument • A szerkesztés alatt álló dokumentum tartalma • A tartalom változásról értesítés kérhető • Position – egy hely megjelölése • Kezdőérték + hossz • Ha a szöveget szerkesztik, automatikusan „követi” a jelölt részt • Partition content-type • A szöveg egyes részei más-más típusúak lehetnek

  28. Szövegkezelés JFace-szel • IDocument • Keresés • Irány • Kezdőpont • case sensitivity, …

  29. Szövegkezelés JFace-szel • ITextViewer • Dokumentum-alapú szöveg komponens • Események • Tartalom változás • Viewport (látható régió) változás • Plugin lehetőségek • IUndoManager – undo/redo kezelés • IDoubleClickStrategy – duplakatt kezelés • IAutoIdentStrategy – automatikus behúzás • ITextHover – ha az egér megáll a szövegen

  30. Szövegkezelés JFace-szel • ITextViewer kiegészítések • org.eclipse.jface.text.contentassist • Automatikus szöveg-kiegészítés • org.eclipse.jface.text.formatter • Automatikus formázás (syntax highlight) • org.eclipse.jface.text.presentation • Változás esetén • org.eclipse.jface.text.source • Vizuális markerek elhelyezése • …

  31. ToolBarManager • JFace elem • Action-öket fogadhat • ToolBar és ToolItem segíségével működik • ControlContribution – új! • Bármilyen kontrollt feltehetünk • Ebben az esetben Action helyett event/listener modell van!

  32. MenuManager • JFace elem • Action-öket fogadhat • Belül Menu és MenuItem példányok vannak • SWT MenuBar-ba is berakható (fill) • new MenuManager(„File) • MenuManager.add(Action) • MenuManager.fill(Control) • Ha hozzáadtuk egy kontrollhoz, többet ne adjuk hozzá máshoz!

  33. Viewer framework • Többféle widget egységes kezelése • MVC pattern • Model: ContentProvider, LabelProvider • View : Viewer • Controller: Listeners • Magasabb szintre emeli az SWT Table, Tree, List elemeit

  34. Viewer framework

  35. Viewer framework • Label provider • getText() • getImage() • isLabelProperty() • Érinti-e a label-t az adott tulajdonság megváltozása? • Alap megvalósítás • A benne lévő elemek toString() metódusával működik

  36. Viewer framework • Content provider • A megjelenítendő elemeket adja meg • getElements() • Nem kötelező használni • Az elemeket hozzáadhatjuk az add metódussal a viewerhez • inputChanged(Viewe, Object, Object) a root objektum megváltozott

  37. Viewer framework • Listener-ek • Függ a viewer típusától • TreeView • ItemSelection • Fa események • StructuredViewer • doubleClick

  38. Viewer framework • Sorter-ek • Elemek rendezése megjelenítés előtt • category() • Elemek kategóriákba sorolása • compare() • Két elem összehasonlítása • Filter • Elemek leválogatása, szelektálása • select() • Meg kell-e jeleníteni egy adott elemet

  39. Viewer framework • TreeViewer • ITreeContentProvider-alapú • A megjelenítendő elemeket adja meg • getChildren() – adott elem gyerekeinek megjelenítése • hasChildren() – vannak-e gyerekei? • Ha lassú kiszámolni, mindig legyen true • getParent() – szülő visszaadása

  40. Viewer framework • ListViewer • Elemek listájának megjelenítésére • IStructuredContentProvider • A megjelenítendő elemeket adja meg • getElements() – a lista elemeit adja vissza • Minden egyéb elem használható • Sorter • Filter • Label provider

  41. Viewer framework • Kiválasztott elemek • IStructuredSelection • Az elemeknek kötött sorrendje van • Biztosít egy iterator-t, hogy végig lépkedhessünk rajtuk

  42. Viewer framework • TableViewer • Táblázat magasabb szinten • TableLayout – a tábla oszlopainak elrendezése • addColumnData() • A mögötte lévő Table elérhető • getTable() • ITableLabelProvider • Adott sor és oszlop tartalmát adja meg

  43. Viewer framework • Táblázatok szerkesztése • CellEditor • ICellModifier • Érték elővétele az objektumból – getValue() • A szerkeszthetőség eldöntése – canModify() • Új érték beírása – modify() • CellEditor • Beépített: Checkbox, Combo box, pop-up dialog, text

  44. JFace dialógusok • MessageDialog • Üzenetek megjelenítése • ErrorDialog • Hibaüzenetek megjelenítése • IStatus – a hiba súlyosságának megadása, üzenet, exception megadása • InputDialog • Egyszerű szöveg bevitelére • IInputValidator – a bevitt szöveg érvényesítése

  45. JFace dialógusok • ProgressDialog • Háttérben futó munka állapotának megjelenítése

  46. Varázslók • 3 szintű hierarchia • WizardContainer – varázslókat tartalmaz • Wizard – oldalakat tartalmaz • canFinish() • performCancel(), performFinish() • createPageControls() • WizardPage – elemeket tartalmaz • getName() • getNextPage(), getPreviousPage() • isPageComplete() • canFlipToNextpage()

  47. DialogSettings • Dialógus beállításainak megőrzése • DialogSettings(String) • put(String, Object) • save(String) • load(String) • get(String) • get*(String)

  48. JFace összefoglalás • Komplex komponensek • Sok automatizmus • Összetett grafikus felületek tervezésére • Akciók • View framework • Dialógusok • Varázslók • GUI állapot mentése

  49. Plug-in fejlesztés

  50. Plug-in fejlesztés • Contribution rule • „everything is a contribution” • Az Eclipse keretrendszer minden eleme egy plug-in • Nincsenek „bevasalt” elemek • Sok plug-in (kb. 60 nagyobb az alap SDK-ban) • Még több lehetséges bővítés (pl. WSAD kb. 500 plug-in)

More Related