Programowanie obiektowe / języki programowania W. 2 - SWT

Podobne dokumenty
Programowanie obiektowe / języki programowania W. 2 - SWT

Dynamiczne i wydajne tworzenie interfejsu. Piotr Michałkiewicz

Informatyka I. Interfejs GUI wysokiego poziomu. Biblioteka Swing. Programowanie zdarzeniowe. Politechnika Warszawska Wydział Transportu 2018

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

Budowa aplikacji z graficznym interfejsem użytkownika - GUI (Graphic User Interface)

Dodanie nowej formy do projektu polega na:

Architektura interfejsu użytkownika

MS Access formularze

Baza danych. Program: Access 2007

Kurs programowania 2 - listy

Sylabus Moduł 2: Przetwarzanie tekstów

Arkusz strona zawierająca informacje. Dokumenty Excela są jakby skoroszytami podzielonymi na pojedyncze arkusze.

Programowanie Obiektowe GUI

Laboratorium 8 ( Android -pierwsza aplikacja)

Ćwiczenie pochodzi ze strony

Formularze w programie Word

GUI - projektowanie interfejsów cz. II

Informatyka Edytor tekstów Word 2010 dla WINDOWS cz.3

Zadanie 1. Stosowanie stylów

Utworzenie aplikacji mobilnej Po uruchomieniu Visual Studio pokazuje się ekran powitalny. Po lewej stronie odnośniki do otworzenia lub stworzenia

Informatyka Edytor tekstów Word 2010 dla WINDOWS cz.3

Podręcznik użytkownika programu. Ceremonia 3.1

Programowanie obiektowe

Kontenery i komponenty graficzne

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

Praca z tekstem: WORD Listy numerowane, wstawianie grafiki do pliku

Zaznaczanie komórek. Zaznaczenie pojedynczej komórki polega na kliknięciu na niej LPM

MS Word Długi dokument. Praca z długim dokumentem. Kinga Sorkowska

KATEGORIA OBSZAR WIEDZY

I. Spis treści I. Spis treści... 2 II. Kreator szablonów Tworzenie szablonu Menu... 4 a. Opis ikon Dodanie nowego elementu...

Programowanie na poziomie sprzętu. Programowanie w Windows API

Informatyka Arkusz kalkulacyjny Excel 2010 dla WINDOWS cz. 1

dla gastronomii i hoteli S4H W PRAKTYCE DOPASUJ NASZE PROGRAMY DO POTRZEB TWOJEJ FIRMY S4H POS MODYFIKACJE EKRANU BONOWANIA

Andrzej Frydrych SWSPiZ 1/8

WASM AppInventor Lab 3. Rysowanie i animacja po kanwie PODSTAWY PRACY Z KANWAMI

Fragment tekstu zakończony twardym enterem, traktowany przez edytor tekstu jako jedna nierozerwalna całość.

Wstawianie nowej strony

CONDICO Trade v

Spis treści. Integracja Shoper

Jarosław Kuchta Podstawy Programowania Obiektowego. Podstawy grafiki obiektowej

Tworzenie i obsługa graficznego interfejsu uŝytkownika

Laboratorium Systemów SCADA

Tworzenie i modyfikowanie wykresów

Ćwiczenie 6 Proste aplikacje - podstawowe komponenty.

5.4. Tworzymy formularze

Tworzenie prezentacji w MS PowerPoint

Programowanie w środowisku graficznym GUI

Tworzenie bazy danych na przykładzie Access

etrader Pekao Podręcznik użytkownika Strumieniowanie Excel

Adobe InDesign lab.1 Jacek Wiślicki, Paweł Kośla. Spis treści: 1 Podstawy pracy z aplikacją Układ strony... 2.

Platforma e-learningowa

Skróty klawiaturowe w PowerPoint

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Obsługa grafiki w Delphi, rysowanie na płótnie, obsługa myszki, zapisywanie obrazków do plików, bitmapy pozaekranowe.

C-geo definicja/edycja obiektów, zapis danych w formacie shape

Przygotuj za pomocą tabulatorów element formularza. Utwórz pole tekstowe i sformatuj tak, aby dół napisu w polu był dokładnie nad kropkami.

Microsoft.NET: LINQ to SQL, ASP.NET AJAX

Miniaplikacja Lokaty zapewnia dostęp do lokat, do których uprawniony jest użytkownik.

Opis implementacji: Implementacja przedstawia Grę w życie jako przykład prostej symulacji opartej na automatach.

Jeżeli pole Krawędź będzie zaznaczone uzyskamy obramowanie w całej wstawianej tabeli

Arkusz kalkulacyjny MS Excel 2010 PL.

OKNO NA ŚWIAT - PRZECIWDZIAŁANIE WYKLUCZENIU CYFROWEMU W MIEŚCIE BRZEZINY

Programowanie obiektowe

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

Ćwiczenie 1: Pierwsze kroki

Założenia projektu: Projekt ma zadanie pokazać praktyczne zastosowanie App Inventor 2, poprzez stworzenie prostej aplikacji do nauki słówek.

Dodawanie grafiki i obiektów

Rozdział VI. Tabele i ich możliwości

CELAB. System Informatyczny. Pracownie krok po kroku LTC 1

Laboratorium z informatyki sem.iii/ćw. 4 Wydział Transportu PW /19

Lp. Nazwisko Wpłata (Euro)

Przewodnik po obszarze roboczym

Informatyka II. Laboratorium Aplikacja okienkowa

Instrukcja obsługi funkcji specjalnych szablonu C01 v.1.0

D:\DYDAKTYKA\ZAI_BIS\_Ćwiczenia_wzorce\04\04_poprawiony.doc 2009-lis-23, 17:44

Rozwiązanie ćwiczenia 8a

Techniki wstawiania tabel

6.4. Efekty specjalne

Spis treści 1. Wstęp Logowanie Główny interfejs aplikacji Ogólny opis interfejsu Poruszanie się po mapie...

Wspólne Zaawansowana tabela

Zadanie 3. Praca z tabelami

LEGISLATOR. Data dokumentu:24 maja 2013 Wersja: 1.3 Autor: Paweł Jankowski, Piotr Jegorow

Europejski Certyfikat Umiejętności Komputerowych. Moduł 3 Przetwarzanie tekstów

Dokument zawiera podstawowe informacje o użytkowaniu komputera oraz korzystaniu z Internetu.

e-wsparcie Barbara Muszko Aktualizacja Twojej witryny internetowej tak prosta, jak obsługa Worda

Dodawanie i modyfikacja atrybutów zbioru

Pokaz slajdów na stronie internetowej

PWŚG Ćwiczenia 13. Ukończoną pracę należy przesłać na adres lub

Autokształtów Autokształt AUTOKSZTAŁTY Wstaw Obraz Autokształty Autokształty GDYNIA 2009

Po wstawieniu tabeli (i zawsze wtedy, gdy w tabeli jest kursor) pojawia się na wstążce nowa grupa zakładek o nazwie Narzędzia tabel.

Formularz MS Word. 1. Projektowanie formularza. 2. Formularze do wypełniania w programie Word

PODSTAWY PROGRAMOWANIA OBIEKTOWEGO W JAVIE ZAGADNIENIA SZCZEGÓŁOWE

MS Excell 2007 Kurs podstawowy Filtrowanie raportu tabeli przestawnej

1. Umieść kursor w miejscu, w którym ma być wprowadzony ozdobny napis. 2. Na karcie Wstawianie w grupie Tekst kliknij przycisk WordArt.

Oficyna Wydawnicza UNIMEX ebook z zabezpieczeniami DRM

Instytut Sterowania i Systemów Informatycznych Uniwersytet Zielonogórski SYSTEMY SCADA

Kopiowanie, przenoszenie plików i folderów

Transkrypt:

Programowanie obiektowe / języki programowania W. 2 - SWT Struktura typowego formularza SWT Display display = new Display (); final Shell shell = new Shell(display); // Zdefiniowanie układu (layout) I utworzenie widgetów (kontrolek) shell.open (); shell.layout(); // Ułożenie widgetów zgodnie z układem, w tym miejscu // można też użyć shell.pack() do skompaktowania układu while (!shell.isdisposed ()) { if (!display.readanddispatch ()) display.sleep (); display.dispose(); Ustalenie układu Mamy do wyboru pięć typów FillLayout (wszystkie widgety w linii, takich samych rozmiarów), RowLayout (wszystkie widgety w linii poziomej lub pionowej, różne rozmiary) GridLayout (krata z możliwością wypełniania kilku komórek) StackLayout (widgety jeden za drugim w trzecim wymiarze, tylko jeden widoczny w danej chwili) FormLayout (dla każdego widgetu ustalamy współrzędne względne w formularzu i rozmiary) Więcej o układach widgetów: https://www.eclipse.org/articles/article-understanding-layouts/understanding-layouts.htm Najczęściej wykorzystujemy GridLayout (zwłaszcza początkujący ), shell.setlayout(new GridLayout(liczba_kolumn, czy_wszystkie_komórki_są_tej_samej_długości)); Możemy sobie wyobrazić kratę jako kolejno ponumerowane komórki (obramowanie nie jest widoczne, o ile go sami nie włączymy) 1 2 3 4 5 6 7 8 (układ może być oczywiście inny w zależności od liczby kolumn zdefiniowanych w GridLayout ale zawsze obowiązuje zasada numerowania komórek wiersz po wierszu ) 1 2 3 4 5 1 2 3 4 5 6 7 8 9 10 11 12

Widgety trafiają do kratek w kolejności, w której je tworzymy. Jeżeli utworzymy dwa przyciski button1 i button2 oraz pole edycji tekstu text1 button1=new Button(shell,SWT.NONE); button1.settext("przycisk pierwszy"); button2=new Button(shell,SWT.NONE); button2.settext("przycisk drugi"); text=new Text(shell, SWT.NONE); Zmiana kolejności widgetów button2=new Button(shell,SWT.NONE); button2.settext("przycisk drugi"); text=new Text(shell, SWT.NONE); button1=new Button(shell,SWT.NONE); button1.settext("przycisk pierwszy"); Ustalanie dodatkowych parametrów konfiguracji układu (jako całości); Obiekt klasy posiada GridLayout ma kilka pól (atrybutów) definiujących parametry układu: horizontalspacing odstęp pionowy po każdym z widgetów verticalspacing odstęp poziomy po każdym z widgetów marginright (Left,Top,Bottom) margines z prawej (lewej, góry dołu) GridLayout gl=new GridLayout(2, true);

gl.horizontalspacing=100; gl.verticalspacing=40; gl.marginright=50; gl.marginleft=50; shell.setlayout(gl); Ustalanie dodatkowych parametrów konfiguracji układu widgetów GridLayout jest związany z klasą GridData określającą parametry układu poszczególnych komórek verticalalignment - wyrównywanie pionowe SWT.CENTER: środek SWT.END (SWT.BOTTOM): dół SWT.FILL: Wypełnienie całości przestrzeni horizontalalignment wyrównywanie poziome SWT.CENTER: srodek SWT.END (or SWT.RIGHT): prawo SWT.FILL: Wypełnienie całości przestrzeni widthhint wskazówka dot. szerokości heighthint - wskazówka dot. wysokości horizontalindent - wcięcie poziome verticalindent wcięcie pionowe horizontalspan liczba zajętych komórek w poziomie verticalspan liczba zajętych komórek w pionie grabexcesshorizontalspace czy rozszerzać układ do szerokości całego okna grabexcessverticalspace czy rozszerzać układ do wysokości całego okna minimumwidth minimalna szerokość minimumheight minimalna wysokość

Label a Text Zazwyczaj układ formularza konstruujemy tak, że w jednym wierszu ustawienie widget typu Label (Etykieta tekst bez możliwości edycji) oraz pole do wprowadzani danych (np. Text, Combo, Button SWT.Check DateTime itp.) labelfirstname=new Label(shell, SWT.NONE); labelfirstname.settext("podaj imię"); firstname=new Text(shell,SWT.BORDER); labellastname=new Label(shell, SWT.NONE); labellastname.settext("podaj nazwisko"); lastname=new Text(shell,SWT.BORDER); labelbirthdate=new Label(shell, SWT.NONE); labelbirthdate.settext("podaj datę urodzenia"); birthdate=new DateTime(shell, SWT.CALENDAR); birthdate=new DateTime(shell, SWT.DROP_DOWN);

Zwróć uwagę na metodę settext ustalającą tekst pojawiający się w etykiecie (występowała już dla przycisków) Puste Label-e a układ Wstawienie pustego widgetu typu Label powoduje przejście następnych widgetów niżej w kracie zdefiniowanej przez GridLayout labeldaneosobowe=new Label(shell, SWT.NONE); labeldaneosobowe.settext("dane OSOBOWE:"); labeldaneosobowe.setfont(new Font(Display.getDefault(), "Chiller", 20, 5)); labelfirstname=new Label(shell, SWT.NONE); labelfirstname.settext("podaj imię"); labelfirstname.setforeground(new Color(null, 255,255,0)); firstname=new Text(shell,SWT.BORDER); firstname.setbackground(new Color(null,220,220,220)); labellastname=new Label(shell, SWT.NONE); labellastname.settext("podaj nazwisko"); labellastname.setforeground(new Color(null, 0,240,0)); lastname=new Text(shell,SWT.BORDER); lastname.setbackground(new Color(null,220,220,220)); labelbirthdate=new Label(shell, SWT.NONE); labelbirthdate.settext("podaj datę urodzenia"); labelbirthdate.setforeground(new Color(null, 240,0,0)); birthdate=new DateTime(shell, SWT.DROP_DOWN);

Po zmianie: labeldaneosobowe=new Label(shell, SWT.NONE); labeldaneosobowe.settext("dane OSOBOWE:"); labeldaneosobowe.setfont(new Font(Display.getDefault(), "Chiller", 20, 5)); Label empty=new Label(shell, SWT.NONE); labelfirstname=new Label(shell, SWT.NONE); labelfirstname.settext("podaj imię"); labelfirstname.setforeground(new Color(null, 255,255,0)); firstname=new Text(shell,SWT.BORDER); firstname.setbackground(new Color(null,220,220,220)); labellastname=new Label(shell, SWT.NONE); labellastname.settext("podaj nazwisko"); labellastname.setforeground(new Color(null, 0,240,0)); lastname=new Text(shell,SWT.BORDER); lastname.setbackground(new Color(null,220,220,220)); labelbirthdate=new Label(shell, SWT.NONE); labelbirthdate.settext("podaj datę urodzenia"); labelbirthdate.setforeground(new Color(null, 240,0,0)); birthdate=new DateTime(shell, SWT.DROP_DOWN); Kolory, fonty itp labeldaneosobowe.setfont(new Font(Display.getDefault(), "Chiller", 20, 5)); labelfirstname.setforeground(new Color(null, 255,255,0));

firstname.setbackground(new Color(null,220,220,220)); Parametry konstruktora (JavaDOC - https://www.eclipse.org/swt/javadoc.php) Typy przycisków SWT.CHECK SWT.RADIO SWT.DEFAULT Widgety zajmujące więcej niż jedną komórkę horizontalspan liczba zajętych komórek w poziomie verticalspan liczba zajętych komórek w pionie Anonimowe metody reagujące na zdarzenia (Listener-y) ArmListener - widget (np menu) jest uzbrojony przed rozwinięciem ControlListener przenoszenie i zmiana rozmiaru widgetów DisposeListener - wywoływany po zdeaktywowaniu widgeta DragDetectListener obsługa mechanizmu drag&drop ExpandListener rozwijanie i zwijanie fragmentów widgetów (o ile mają zaimplementowany taki mechanizm jak np. SashForm) FocusListener otrzymanie lub utrata fokusu (obiekt posiadajacy focus to ten który jest aktualnie widoczny i wyróżniony, z aktywnym kursorem tekstu)

GestureListener obsługa gestów (touch-pady i ekrany dotykowe) HelpListener - wywoływany przy prośbie o pomoc, najczęściej po naciśnięciu F1 KeyListener obsługa naciśnięcia, przytrzymania i zwolnienia klawiszy na klawiaturze MenuDetectListener wywołanie menu kontekstowego (w MS Windows prawy przycisk myszy) Classes which implement this interface provide methods that deal with the events that are generated when the platform-specific trigger for showing a context menu is detected. MenuListener pokazywanie lub ukrywanie menu ModifyListener zmiana tekstu w widgecie MouseListener naciśnięcie klawiszy myszy MouseMoveListener ruch myszy MouseTrackListener ruch urządzeniem track-ball MouseWheelListener ruch kółkiem środkowym myszy PaintListener metoda wywoływana kiedy SWT stwierdzi konieczność przerysowania widgetu najczęściej wykorzystywana do tworzenia własnych kompozycji / innego rysowania widgetu, a dla widgetu canvas do własnej grafiki 2D SegmentListener SelectionListener wybór widget-a (np kliknięcie w przycisk) ShellListener - zamykanie, zmniejszania do ikonki, przywracania itp. powłoki (okna) TouchListener - obsługa dotknięcia ekranu dotykowego (ekrany dotykowe) TraverseListener zdarzenie wywoływane przy przechodzeniu między widgetami (np. tabulatorem) TreeListener rozwinięcie lub zwinięcie węzła w drzewie VerifyListener wywoływany przed rozpoczęciem modyfikowania tekstu shell.addshelllistener(new ShellListener() { public void shelliconified(shellevent arg0) { MessageBox mb=new MessageBox(shell,SWT.ICON_QUESTION); mb.setmessage("ale dlaczego mnie chowasz?"); mb.open(); public void shelldeiconified(shellevent arg0) { arg0.doit=false;

public void shelldeactivated(shellevent arg0) { arg0.doit=false; public void shellclosed(shellevent arg0) { arg0.doit=false; public void shellactivated(shellevent arg0) { arg0.doit=false; ); shell.addcontrollistener(new ControlListener() { public void controlresized(controlevent arg0) { System.out.println(shell.getSize().x); if (shell.getsize().x<500){ shell.setbackground(new Color(null,255,0,0)); else if (shell.getsize().x<600){ shell.setbackground(new Color(null,255,255,0)); else if (shell.getsize().x<700){ shell.setbackground(new Color(null,0,255,0)); if (shell.getsize().x>800){ labelwarning.setvisible(true); else{ labelwarning.setvisible(false);

public void controlmoved(controlevent arg0) { shell.setbackground(display.getdefault().getsystemcolor(swt.color_info_background)); ); MessageBox Często w aplikacjach zachodzi potrzeba wyświetlenia informacji w osobnym oknie. Można to robić wywołując osobny podformularz MessageBox mb=new MessageBox(shell,opcje); mb.settext(tekst_w_pasku_górnym); mb.setmessage(tekst_wew_wnętrzu_okienka); mb.open(); Komunikat może być połączony z zadawaniem pytania: MessageBox mb=new MessageBox(shell,SWT.YES SWT.NO); mb.setmessage( Czy na pewno usunąć pozycję faktury? ); if(mb.open()==swt.yes){ Przekazywanie danych między formularzami Niekiedy samo wyświetlenie tekstu lub zadanie pytania w podformularzu nie wystarcza (np. chcemy, aby w podformularzu były wprowadzone dodatkowe dane). W takim przypadku tworzymy w osobnej klasie formularz według takich samych zasad jak formularz główny, z jednym wyjątkiem : nie usuwamy z pamięci (dispose()) obiektu display po pętli sterującej // display.dispose(); To jest ten sam obiekt, który jest używany w formularzu nadrzędnym więc usuniecie go wiązałoby się z zakończeniem całej aplikacji, co gorsze po drodze najprawdopodobniej dostalibyśmy komunikat object (widget) is disposed(); Otwarcie podformularza odbywa się w sposób zbliżony do poniższego: A zamknięcie : public void widgetselected(selectionevent arg0) { SubFormForTable sf=new SubFormForTable(); sf.initgui();

backbutton.addselectionlistener(new SelectionAdapter() { public void widgetselected(selectionevent arg0) { articlevalue=article.gettext(); quantityvalue=double.parsedouble(quantity.gettext()); pricevalue=double.parsedouble(price.gettext()); shell.close(); ); Przekazywanie danych między formularzami Z formularza nadrzędnego nie można bezpośrednio pobierać danych widgetów podformularza, gdyż w momencie powrotu do niego sterowania cały podformularz i wszystkie widgety w nim się znajdujące są już zdezaktywowane (disposed) a informacja w nich zawarta utracona. Aby przedłużyć stosuje się obiekty(pola) pomocnicze NIE będące widgetami. Najpierw zapamiętując przed zamknięciem informacje w tych zmiennych. public String articlevalue; public Double quantityvalue; public Double pricevalue; public void widgetselected(selectionevent arg0) { articlevalue=article.gettext(); quantityvalue=double.parsedouble(quantity.gettext()); pricevalue=double.parsedouble(price.gettext()); shell.close(); A następnie odtwarzając je z poziomu formularza nadrzędnego. public void widgetselected(selectionevent arg0) { SubFormForTable sf=new SubFormForTable(); sf.initgui(); TableItem ti=new TableItem(table, SWT.BORDER); ti.settext(new String[]{sf.getArticleValue(),sf.getQuantityValue().toString(),sf.getPriceValue().toString()); Obrazki w widgetach Część widgetów umożliwia wyświetlania ikon/obrazków w standardzie button1=new Button(shell,SWT.NONE); button1.setimage(new Image(Display.getDefault(),"qr.png"));

Rysowanie w widgetcie canvas Jeżeli obrazek nie ma być ikoną w widgecie ale osobną ilustracją graficzną (np. wyświetlenie zdjęcia) to do stworzenia grafiki można użyć rysowania w (na) kanwie. canvas=new Canvas(shell,SWT.NONE); canvas.addpaintlistener(new PaintListener() { public void paintcontrol(paintevent arg0) { Image i= new Image(Display.getDefault(),"tajski.jpg"); arg0.gc.drawimage(i, 0, 0); ); *** Są też gotowe komponenty do obrazków takie jak: https://eclipse.org/nebula/widgets/gallery/gallery.php Obrazki w widgetcie canvas wstęp do animacji Animacja w SWT opiera się zazwyczaj na odpowiednim sparametryzowaniu metody paintcontrol dla widgetu Canvas canvas.addpaintlistener(new PaintListener() { public void paintcontrol(paintevent arg0) {

scaled = new Image(Display.getDefault(), new Double(i.getBounds().width*scale).intValue(), new Double(i.getBounds().height*scale).intValue()); arg0.gc.setantialias(swt.on); arg0.gc.setinterpolation(swt.high); arg0.gc.drawimage(i, 0, 0, i.getbounds().width, i.getbounds().height,0, 0, new Double(i.getBounds().width*scale).intValue(), new Double(i.getBounds().height*scale).intValue()); ); scaled.dispose(); i wywoływaniu co pewien interwał czasu metody redraw() Runnable r=new Runnable() { public void run() { if(direction==-1.0){ if(scale>scalefrom){ scale-=step; else{ direction*=-1; else{ if(scale<scaleto){ scale+=step; else{ direction*=-1; display.timerexec(200, this); canvas.redraw(); ; display.timerexec(200, r);

Animacja w sposób przedstawiony powyżej często związana jest z efektem migania. Aby go zredukować (choć nie zawsze całkowicie zlikwidować) stosujemy mechanizm podwójnego buforowania, Najpierw tworząc instancję klasy Image nie wyświetlaną bezpośrednio na ekranie a w ostatnim kroku jedynie kopiując wygenerowany obraz do GC (kontekstu graficznego) widgetu canvas canvas.addpaintlistener(new PaintListener() { public void paintcontrol(paintevent arg0) { Image image = new Image(shell.getDisplay(), canvas.getbounds()); GC gcimage = new GC(image); scaled = new Image(Display.getDefault(), new Double(i.getBounds().width*scale).intValue(), new Double(i.getBounds().height*scale).intValue()); gcimage.setantialias(swt.on); gcimage.setinterpolation(swt.high); gcimage.drawimage(i, 0, 0, i.getbounds().width, i.getbounds().height,0, 0, new Double(i.getBounds().width*scale).intValue(), new Double(i.getBounds().height*scale).intValue()); arg0.gc.drawimage(image, 0, 0); image.dispose(); gcimage.dispose(); scaled.dispose(); ); Kompozyty i widgety grupujące Czasami zachodzi sytuacja, w której z różnych względów powinniśmy pogrupować widgety w większą całość. Używamy do tego celu komponentów Composite ScrolledComposite lub Group. Przy tworzeniu widgetów wewnątrz kompozytu przekazujemy go jako pierwszy argument przekazujemy zamiast, tak jak w dotychczasowych przykładach, aktualnej powłoki (shelll-a). Stosowanie kompozytu zazwyczaj ma na celu jeden z dwóch celów: 1) Umieszczenie we wnętrzu pojedynczej komórki układu (layout-u) kilku widgetów w określonym porządku (p. przykład z dwoma przyciskami typu radio button) Composite c=new Composite(shell, SWT.BORDER); c.setlayout(new GridLayout(2, true)); Button b3=new Button(c,SWT.RADIO); b3.settext("kobieta"); Button b4=new Button(c,SWT.RADIO); b4.settext("mężczyzna");

W takim przypadku kompozyt jest związany zarówno z obiektem GridData (RowData, FlowData itp.), określającym jego położenie w układzie nadrzędnym oraz GridLaout, RowLayput itp.) określającym jak widgety mają być ułożone wewnątrz kompozytu. 2) Pogrupowanie widgetów i umiejscowienie ich w kompozytach grupujących takich jak SashForm czy CTabs Iterowanie po kolekcjach (kolor dla wszystkich pól w formularzu) W SWT nie ma mechanizmu domyślnego ustalenia parametrów. Jeżeli chcemy zmienić np. kolor czcionki dla więcej niż jednego widgetu wewnątrz grupy (lbub shell-a) możemy wykorzystać kolekcję.getchildren(); button.addselectionlistener(new SelectionAdapter() { public void widgetselected(selectionevent arg0) { RGB color = new ColorDialog(shell).open(); for(control c:shell.getchildren()){ if (c instanceof Label){ c.setforeground(new Color(null, color)); );