510 likes | 678 Views
Biblioteka SWT. czyli JAVA okienkowo ;). Wykonali:. kpr. pchor. rez. Paweł Pasiecznik Tomasz Pyszka Marcin Stelmach Michał Świdrak Paweł Wcisło. Plan. Przegląd graficznych interfejsów Javy SWT – jak to ugryźć ?? SWT + pliki *.jar Podstawy SWT
E N D
Biblioteka SWT czyli JAVA okienkowo ;) Wykonali: kpr. pchor. rez. Paweł Pasiecznik Tomasz Pyszka Marcin Stelmach Michał Świdrak Paweł Wcisło
Plan • Przegląd graficznych interfejsów Javy • SWT – jak to ugryźć ?? • SWT + pliki *.jar • Podstawy SWT • Podstawy: Label, Text, Button, List, Combo, Composite, Listeners • Layouty w SWT Plan
Graficzne interfejsy Javy • AWT (Abstract Windowing Toolkit) – korzysta z obiektów dostępnych w danym systemie operacyjnym, zadaniem komponentów wchodzących w skład AWT jest bowiem jedynie pewnego rodzaju „opakowanie” tego, co oferuje system • SWING – nie korzystamy z obiektów dostępnych w systemie, elementy sterujące napisane są całkowicie w Javie. Wady: wolne działanie, wygląd nienaturalny Zalety: duża funkcjonalność • SWT (Standard Widget Toolkit) – dostępny jest zestaw elementów sterujących, które opierają się na rodzimych obiektach danego systemu. Do ich obsługi wykorzystywany jest interfejs JNI (Java Native Interface). Graficzne interfejsy Javy
Systemy Operacyjne a SWT Dla każdego systemu operacyjnego dostępna jest odpowiednia wersja SWT. (Dodajemy odpowiedni plik dla danego systemu - swt.jar) • Windows – musimy dodać odpowiedni plik dll swt-win32-*.dll • Linux (GTK) – oprócz swt.jar dodajemy również swt-pi.jar • Solaris Motif • AIX Motif • HPUX Motif • Photon QNX • Mac OS X Systemy operacyjne a SWT
Eclipse + SWT • Odwiedzamy stronke www.eclipse.org • Ściągamy Eclipsa i biblioteke SWT • Tworzymy nowy projekt w eclipsie • Dodajemy biblioteke swt.jar do projektu Eclipse + SWT
Pliki jar i SWT – w czym problem ?? Rodzaje tworzenia i uruchamiania pliku jar: • Kopiujemy pliki biblioteki swt *.dll i *.jar do tego samego katalogu gdzie znajduje się stworzony przez nas plik HelloWorld.jar Uruchomienie: #java –jar HelloWorld.jar • Kopiujemy pliki biblioteki swt do katalogu w którym znajduje się plik HelloWorld.jar. Podczas uruchamiania podajemy scieżkę do katalogu z biblioteka swt zawierajacy pliki *.dll Uruchomienie: #java –Djava.library.path=„scieżka_do_katalogu” –jar HelloWorld.jar Pliki jar i SWT – w czym problem ??
Linki • SWT: http://www.eclipse.org/swt/ • Eclipse: http://www.eclipse.org/downloads/ • API: http://help.eclipse.org/help31/nftopic/org.eclipse.platform.doc.isv/reference/api/index.html Linki
Wstęp do podstaw SWT Obiekt Display – reprezentuje sesję w SWT. Sesja ta rozumiana jest jako połączenie między naszą aplikacją SWT a systemem operacyjnym. Zawiera metody rozpoczynające działanie obsługi zdarzeń i koordynuje wątek interfejsu użytkownika z pozostałymi częściami działającego programu. Obiekt Shell – pierwszy element tego typu jest głównym oknem aplikacji. Okno możemy przesuwać, minimalizować itp. Kolejne okna, czyli obiekty typu Shell, mogą być tworzone na zasadzie okien potomnych, zależnych od innych, już istniejących. Wstęp do podstaw SWT
Przykład SWT import org.eclipse.swt.widgets.*; import org.eclipse.swt.*; public class SWTHello { public static void main(String[] args) { Display display = Display.getDefault(); Shell sShell = new Shell(); sShell.setText("Example SWT"); sShell.setSize(new Point(300, 200)); sShell.setLayout(null); Label label = new Label(sShell, SWT.NONE); label.setBounds(new Rectangle(50, 50, 175, 41)); label.setFont(new Font(Display.getDefault(), "Tahoma", 24, SWT.NORMAL)); label.setText("Hello World"); sShell.open(); while (!sShell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); // WAZNE!!! Musimy zwolnić ręcznie zaalokowane zasoby systemu // operacyjnego } } Przykład SWT
Label labels
Text texts
Button buttons
List lists
Combo combos
Composite composites
Group groups
Key Listener listeners
Mouse Listener listeners
Listeners (metody) • Mouse Track Listener (mouseEnter, mouseExit and mouseHover) • Mouse Move Listener (mouseMove) • Jeśli kursor poruszy się nad obiektem • Text Listeners: • ModifyListener (modifyText) • VerifyListener (verifyText) • Focus Listeners: • FocusListener (focusGained, focusLost) • TraverseListener:(keyTraversed) listeners
Zawansowane możliwości SWT • Plan: • Tabele • Zakładki • Suwaki i Pasek postępu • Drzewa • Grafika • Okna dialogowe • Zaawansowana obsługa zdarzeń Zawansowane możliwości SWT- kontekst
Tabele – ogólna charakterystyka Tworzymy tabele: Table table1 = new Table(shell, SWT.BORDER); Możliwe style tabeli: BORDER, H_SCROLL, V_SCROLL, SINGLE, MULTI, CHECK, FULL_SELECTION i HIDE_SELECTION. Możliwe opcje dla tabeli: • table1.setLinesVisible(true); • table1.setHeaderVisible(true); Zawansowane możliwości SWT- Tabele
Tabele – kolumny Tworzenie kolumny: TableColumn name = new TableColumn(table1,SWT.LEFT); Możliwe style kolumny: LEFT, RIGHT i CENTER. Dla każdej kolumny powinno ustawić się jeszcze nazwę oraz rozmiar kolumny: • name.setText("Name"); • name.setWidth(50); Zawansowane możliwości SWT– Tabele -> kolumny
Tabele – wiersze Tworzenie wierzsza: TableItem item1 = new TableItem(table1,SWT.NONE); Brak stylów wiersza, więc powinno się użyć stylu: NONE (0). Wypełnianie wiersza: • item1.setText(new String[] {"Sarah","15","390 Sussex Ave"}); Zawansowane możliwości SWT– Tabele -> wiersze
Tabele – podsumowanie Czynności potrzebne do implementacji tabeli: • Stworzenie tabeli • Stworzenie kolumn dla danej tabeli • Dodawanie wierszy do tabeli Wizualizacja tabel: • Ustawienie kolorów: setBackground(Color) i set Foreground(Color) • Widoczność linii oraz nagłówkó: setLinesVisible(boolean) setHeaderVisible(boolean). Zawansowane możliwości SWT– Tabele -> podsumowanie
Zakładki Tworzenie TabFolder: TabFolder tabFolder1 = new TabFolder(shell,SWT.NONE); Możliwe style TabFolder: BORDER. Tworzenie TabItem: TabItem item1 = new TabItem(tabFolder1,SWT.NONE); Do każdego TabItem powinno ustawić się nazwę zakładki oraz • item1.setText("Buttons"); • item1.setControl(Composite); Zawansowane możliwości SWT- Zakładki
Suwaki i pasek postępu Tworzenie: Slider slider1 = new Slider(shell, SWT.HORIZONTAL); Scale scale1 = new Scale(shell, SWT.HORIZONTAL); ProgressBar progressBar1 = new ProgressBar(shell,SWT.HORIZONTAL) • Możliwe style: BORDER, HORIZONTAL i VERTICAL. Metody używane dla powyższych suwaków i paska postępu: • setSelection(int); • setMaximum(int); • setMinimum(int); Dla Slider: setThumb(int) - rozmiar suwaka Dla Scale: setPageIncrement(int) - liczba podziałek Zawansowane możliwości SWT– Suwaki i pasek postępu
Drzewa Tworzenie drzewa: Tree tree = new Tree(shell, SWT.MULTI | SWT.BORDER); Możliwe style:BORDER, MULTI, SINGLE i CHECK. Tworzenie liści: TreeItem treeItem = new TreeItem(tree, SWT.NONE); opcjonalnie TreeItem treeItem = new TreeItem(tree, SWT.NONE, index); Możliwe metody: setText(String) - dodanie tekstu setImage(Image) - dodanie ikony do liścia Zawansowane możliwości SWT- Drzewa
Grafika – informacje ogólne Grafika w SWT umożliwia nam następujące rzeczy: • Rysowanie oraz wypełnianie prostokątów, owali, linii, wielokątów, i tekstów • Ustawienie kolorów wypełnienia oraz pierwszoplanowych • wycinanie regionów • kopiowanie rejonów do obrazów lub innych obszarów z naszego systemu • Wyświetlanie obrazów • Pobranie oraz ustawienie tekstu/czcionki systemowych. Z grafiką związane są głównie następujące kalasy: • Canvas • GC • Image Zawansowane możliwości SWT- Grafika –> informacje ogólne
Rysowanie Aby móc rysować trzeba stworzyć przynajmniej dwa obiekty: Canvas canvas = new Canvas(shell, SWT.BORDER); GC gc = new GC(canvas); Przy rysowaniu stosuje się podobne metody jak w Swing-u np. : • gc.drawRectangle(3, 5, 20, 25); • gc.fillRectangle(30, 5, 20, 25); • gc.setForeground(blue); • gc.drawLine(80, 20, 100, 80); • gc.drawOval(40, 40, 10, 10); • gc.drawPolygon(new int[] {100, 100, 120, 120, 140, 100}); • gc.setBackground(red); • gc.drawString("Text", 120, 20); • gc.setClipping(40, 60, 40, 40); • gc.fillOval(30, 50, 30, 25); Należy pamiętać o zwolnieniu zasobów!!! (gc.dispose()) Zawansowane możliwości SWT- Grafika –> rysowanie
Grafika – obrazy Tworzenie obrazu: Image img = new Image(display, "EclipseBannerPic.jpg") lub jeżeli obraz znajduje się w archiwum jar InputStream is = getClass().getResourceAsStream("EclipseBannerPic.jpg") Image img = new Image(display, is) Możliwe jeste także stworzenie kopii obrazu z następującymi flagami: • SWT.IMAGE_COPY - kopiuje obraz bez zmian • SWT.IMAGE_GRAY - obraz w odcieniach szarości • SWT.IMAGE_DISABLE - „ustawia obraz jako nieaktywny” Przykład Image gray = new Image(display, Image, SWT.IMAGE_GRAY); Rysujemy za pomocą metody: drawImage(Image,width,height) Należy pamiętać o zwolnieniu zasobów!!! (img.dispose()) Zawansowane możliwości SWT- Grafika –> obrazy
Grafika – odmalowywanie Komponenty graficzne w SWT nie są automatycznie odmalowywane !!! Po każdej utracie aktywności okna możemy utracić nasze komponenty graficzne. Aby ubezpieczyć się przed takim stanem możemy zaimplementować poniższą metodę: shell.addPaintListener(new PaintListener() { publicvoid paintControl(PaintEvent e) { GC gc = e.gc; Display d = e.widget.getDisplay(); Color color = new Color(d, 120, 42, 105); // Color red = display.getSystemColor(SWT.COLOR_RED); gc.setForeground(color); Font font = new Font(d, "Arial", 24, SWT.BOLD | SWT.ITALIC); gc.setFont(font); gc.drawString("Text", 20, 20); color.dispose(); font.dispose(); } Metoda ta jest wykonywana przy każdej potrzebie odmalowania okna. Metodę tą można także wywołać za pomocą metody redraw() Zawansowane możliwości SWT- Grafika –> odmalowywanie
Okna dialogowe - Message Box • Tworzenie MessageBox: MessageBox messageBox = new MessageBox(shell, SWT.ICON_QUESTION |SWT.YES | SWT.NO | SWT.CANCEL); • Ustawienie komunikatu: messageBox.setMessage("Do you like apples?") • Ustawianie tytułu messageBox.setText("MessageBoxDemo") • Możliwe style MessageBox: ICON_ERROR, ICON_INFORMATION, ICON_QUESTION, ICON_WARNING i ICON_WORKING. • Możliwe style kombinacje „odpowiedzi” Message box: • OK | CANCEL • YES | NO • YES | NO | CANCEL • RETRY | CANCEL • ABORT | RETRY | IGNORE • Otwieranie okna /okno jest modalne i zwraca wybraną opcje/ intresponse = messageBox .open() Zawansowane możliwości SWT– Okna dialogowe –> MessageBox
Message Box cd. • Przechwytywanie odpowiedzi: switch(response) { case SWT.YES: System.out.println("Yes, the user likes apples."); break; case SWT.NO: System.out.println("No, the user does not like apples."); break; case SWT.CANCEL: System.out.println("The user cancelled."); break; } Zawansowane możliwości SWT– Okna dialogowe –> MessageBox cd.
ColorDialog • Tworzymy: ColorDialog colorDialog1 = new ColorDialog(shell); • Ustawiamy tytuł: colorDialog1.setText("ColorDialog Demo"); • Ustawiamy kolor domyślny: colorDialog1.setRGB(new RGB(255,0,0)); • Wywołanie: RGB selectedColor = colorDialog1.open(); Zawansowane możliwości SWT– Okna dialogowe –> ColorDialog
FontDialog FontData defaultFontData = new FontData("Courier",12,SWT.ITALIC); FontDialog fontDialog = new FontDialog(shell, SWT.NONE); fontDialog.setText("FontDialog Demo"); fontDialog.setRGB(new RGB(0,0,255)); fontDialog.setFontData(defaultFontData); FontData fontData = fontDialog.open(); if (fontData != null) { fontData.getName(); fontData.getHeight(); fontData.getStyle(); fontDialog.getRGB(); } Zawansowane możliwości SWT– Okna dialogowe –> FontDialog
DirectoryDialog & FileDialog • DirectoryDialog DirectoryDialog directoryDialog = new DirectoryDialog(shell); directoryDialog.setText("DirectoryDialog Demo"); directoryDialog.setFilterPath("C:/Program Files"); String selectedDirectory = directoryDialog.open(); • FileDialog String[] filterExtensions = {"*.txt","*.doc", "*.*"}; FileDialog fileDialog = new FileDialog(shell, SWT.OPEN) fileDialog.setText("FileDialog Demo"); fileDialog.setFilterPath("C:/"); fileDialog.setFilterExtensions(filterExtensions); String selectedFile = fileDialog.open(); Zawansowane możliwości SWT– Okna dialogowe –> FileDialog
Okna dialogowe Do stworzenia okna drukowania używamy PrintDialog Do stworzenia SWT nie zawiera gotowego InputDialog aby stworzyć InputDialog należy samemu zaimplementować powyższy komponent rozszerzając ją o klasę Dialog np. class InputDialog extends Dialog { public MyData open() { } } Zawansowane możliwości SWT– Okna dialogowe –> Okna dialogowe
Zaawansowana obsługa zdarzeń • W SWT w przeciwieństwie do Swing-a sami musimy martwić się o hierarchię zdarzeń. Tzn. Proces główny steruje nasłuchiwaniem i sterowaniem wszystkich zdarzeń więc bardzo dobrym sposobem jest implementacja w metodach nasłuchiwaczy tworzenie wątków przy większych implementacjach np.. button.addSelectionListener(new SelectionAdapter() { publicvoid widgetSelected(SelectionEvent e) { new MyThread().start() } }); • W SWT nie powinniśmy się odwoływać bezpośrednio do elementów sterujących będąc w innym wątku niż główny. Aby odwołać się do tych elementów z innych wątków jak główny powinniśmy użyć następujących metod: syncExec(Runnable) oraz asyncExex(Runnable) np.. Display.getDefault().asyncExec(new Runnable() { public run() { label.setText(„Bez obaw!”); } }; Zawansowane możliwości SWT– Zaawansowana obsługa zdarzeń
Podsumowanie Warto także zapoznać się z następującymi rzeczami: • Menu (Menu, MenuItem) • Wyskakujące menu (jak powyżej) • Transfer zasobów pomiędzy aplikacjami (Drag, Drop i Clipboard) Należy zawsze pamiętać o zwalnianiu zasobów następujących klas: • Image • GC • Color • Font • Itp.. Najkrócej mówiąc takich które tworzymy na podstawie zasobów systemowych Zawansowane możliwości SWT– Okna dialogowe –> Podsumowanie
Layouty w SWT • Dla przypomnienia: layouty to narzędzie do nadawania kontrolkom odpowiedniego rozmieszczenia oraz kształtu (rozmiaru) na obiektach klasy Composite. • SWT dostarcza standardowo kilka rodzajów layoutów, • Ponadto jest możliwość tworzenia nowych layoutów dostosowanych do potrzeb użytkownika. Layouty w SWT
Czemu używać layoutów? • SWT nie rozmieszcza ani nie dobiera rozmiarów dla kontrolek automatycznie -> jeśli sami tego nie zrobimy, kontrolka nie będzie widoczna. Można to zrobić bezpośrednio np. w konstruktorze naszego formularza lub w „resize listenerze”. Jednak dopóki nie ma solidnych podstaw to tego, żeby to zrobić samemu, lepiej tego nie robić . • Tutaj z pomocą przychodzą layouty. Czemu używać layoutów?
Sposób użycia • Import odpowiednich pakietów: import org.eclipse.swt.layout.*; • Metoda setLayout(Layout) klasy Composite: Shell shell = new Shell(); shell.setLayout(new RowLayout()); • Klasy layoutów udostępniają również klasy opisujące kontrolkę na formie o danym layoucie (klasy te mają nazwy, które powstają poprzez zastąpienie tekstu Layout tekstem Data w nazwie klasy layoutu): Button button = new Button(shell, SWT.PUSH); button.setLayoutData(new RowData(50, 40)); Sposób użycia
FillLayout • Najprostszy dostępny layout. • Umieszcza kontrolki w rzędzie lub kolumnie. Wszystkie mają taki sam rozmiar. • fillLayout.type = SWT.HORIZONTAL (default): • fillLayout.type = SWT.VERTICAL : FillLayout
RowLayout • Możliwości FillLayout + • zawijanie kontrolek na następnego wiersza • możliwość ustawienia wielkości marginesów oraz odległości między kontrolkami • możliwość ustawienia wielkości pojedynczej kontrolki: kontrolka.setLayoutData(new RowData(50, 40)); • Parametry RowLayout: RowLayout
RowLayout cd. • wrap: • true (default): • false: • pack • true (default): • false: • justify • true: RowLayout cd.
GridLayout • Layout o największych możliwościach, ale najtrudniejszy w użyciu. • Kontrolki umieszczamy na siatce. • Parametry GridLayout: • numColumns – liczba kolumn • makeColumnsEqualWidth – wszystkie kolumny będą miały taką samą szerokość (domyślnie false) • marginWidth, marginHeight, horizontalSpacing, verticalSpacing. • Parametry GridData: • horizontalAlignment: BEGINNING, CENTER, END, FILL • verticalAlignment: j/w • horizontalIndent – lewy margines w komórce • horizontalSpan, verticalSpan – określają, ile kolumn lub wierszy zajmuje dana kontrolka • grabExcessHorizontalSpace, grabExcessVerticalSpace • widthHint, heightHint GridLayout
GridLayout - przykład Display display = new Display (); Shell shell = new Shell (display); GridLayout gridLayout = new GridLayout (); gridLayout.numColumns = 2; shell.setLayout (gridLayout); Label label0 = new Label (shell, SWT.NONE); label0.setText ("label0"); GridData data = new GridData (); data.widthHint = 50; data.horizontalAlignment = GridData.END; label0.setLayoutData (data); Text text1 = new Text (shell, SWT.BORDER); text1.setText ("text1"); Combo combo2 = new Combo (shell, SWT.NONE); combo2.setItems (new String [] {"Item 1", "Item 2", "Item 2"}); combo2.setText ("combo2"); List list3 = new List (shell, SWT.BORDER); list3.setItems (new String [] {"Item 1", "Item 2", "Item 2"}); data = new GridData (); data.widthHint = 100; data.horizontalAlignment = GridData.FILL; data.verticalAlignment = GridData.FILL; data.verticalSpan = 2; data.grabExcessVerticalSpace = true; list3.setLayoutData (data); Group group4 = new Group (shell, SWT.NONE); group4.setText ("group4"); GridLayout - przykład
FormLayout • Podobno o największych (?) możliwościach. • O ile w przypadku poprzednich layoutów określenie dla kontrolki obiektu NazwaLayoutuData (RowData, GridData) było opcjonalne, w przypadku FormLayout jest to niezbędne (w przeciwnym razie kontrolki zostaną umieszczone jedna na drugiej). • Zasada rozmieszczenia kontrolek przy użyciu FormLayoutu polega na podaniu położenia danej kontrolki w stosunku do innej (tj. całej formy lub konkretnej kontrolki znajdującej się już na formie). FormLayout
FormLayout - przykład Display display = new Display (); Shell shell = new Shell (display); FormLayout formLayout = new FormLayout (); shell.setLayout (formLayout); Label label0 = new Label (shell, SWT.NONE); label0.setText ("label0"); FormData data = new FormData (); data.width = 50; label0.setLayoutData (data); Text text1 = new Text (shell, SWT.BORDER); text1.setText ("text1"); data = new FormData (); data.left = new FormAttachment (0, 50); text1.setLayoutData (data); Label label2 = new Label (shell, SWT.NONE); label2.setText ("label2"); data = new FormData (); data.width = 50; data.top = new FormAttachment (0, 30); label2.setLayoutData (data); Combo combo3 = new Combo (shell, SWT.NONE); combo3.setItems (new String [] {"Item 1", "Item 2", "Item 2"}); combo3.setText ("combo3"); data = new FormData (); data.left = new FormAttachment (0, 50); data.top = new FormAttachment (0, 30); combo3.setLayoutData (data); FormLayout - przykład