SWT poskytuje grafické prostředky pro kreslení grafiky a zobrazování obrázků v prvcích widget. Můžete dojít docela daleko i bez programování grafického rozhraní, protože prvky widget za vás ošetřují kreslení ikon, textu a další data. Pokud ovšem vaše aplikace zobrazuje uživatelskou grafiku, nebo pokud implementujete uživatelsky nakreslený prvek widget, pak budete muset porozumět některým základním objektům kreslení v SWT.
Grafický kontext GC je cílovým místem pro podporu grafiky SWT. Jeho API popisuje všechny možnosti kreslení v SWT.
GC lze použít pro kreslení na obslužný prvek (nejčastější případ), na obrázek, na obrazovku nebo na tiskárnu. Při kreslení na obslužný prvek používáte GC poskytnutý v události vykreslení obslužného prvku. Při kreslení na obrázek, obrazovku nebo tiskárnu musíte vytvořit GC, který je příslušným způsobem konfigurován, a po ukončení používání GC zlikvidovat.
Jakmile získáte GC, můžete nastavit jeho atributy, tj. barvu, šířku řádku a písmo, které řídí vzhled grafiky vykreslované v GC.
Odkaz rozhraní API pro GCpopisuje úplnou sadu grafických funkcí.
Při manipulaci s písmy v SWT se používají třídy Font a FontData.
FontData popisuje charakteristiky písma. FontData můžete vytvořit zadáním názvu, stylu a velikosti písma. FontData obsahuje rozhraní API pro dotazování těchto atributů. Protože FontData nealokuje žádné prostředky operačního systému, nemusíte jej zlikvidovat.
Font je skutečný grafický objekt reprezentující písmo použité v rozhraní API kreslení. Font pro Display vytvoříte zadáním Display a FontData požadovaného písma. Můžete rovněž dotazovat FontData písma.
Po ukončení používání písma musíte alokované písmo zlikvidovat.
Barvy jsou podobné písmům. Barvu pro Display vytvoříte zadáním hodnot RGB požadované barvy. Alokovanou barvu musíte zlikvidovat, když ji přestanete používat.
Metoda zobrazení getSystemColor(int)
umožňuje dotazovat předdefinované systémové barvy operačního systému. Barvy získané touto technikou byste neměli uvolňovat.
Model barev je podrobně diskutován v článku SWT color model.
Při manipulaci s obrázky v SWT se používají třídy Image, ImageData a ImageLoader.
ImageData popisuje skutečné pixely obrázku, přičemž používá třídu PaletteData k popisu hodnot použitých barev. ImageData nezávisí na popisu obrázku specifickém pro dané zařízení či platformu.
ImageLoader načítá a ukládá ImageData do souborů různých formátů. SWT v současné době podporuje načítání a ukládání obrazových formátů BMP (Windows Bitmap), ICO (Windows Icon), JPEG, GIF a PNG.
Image je skutečný grafický objekt reprezentující obrázek použitý v rozhraní API kreslení. Můžete vytvořit obrázek pro konkrétní Display. Obrázky lze vytvořit několika způsoby:
Bez ohledu na způsob vytvoření obrázku nesete odpovědnost za jeho likvidaci.
Většina grafických objektů použitých pro kreslení v SWT alokuje prostředky v základním OS a musí být explicitně uvolněna. Platí zde stejné pravidlo, jaké bylo diskutováno dříve. Pokud jej vytvoříte pomocí konstruktoru, musíte jej uvolnit. Pokud získáte přístup odjinud, neuvolňujte jej.
Grafické objekty, jako je grafický kontext, písmy, barvy a obrázky, jsou alokovány v OS, jakmile je objekt vytvořen. To, jak plánujete svůj grafický objekt používat, určuje, kdy byste jej měli vytvořit.
Grafické objekty, které jsou používány intenzivně v celé aplikaci, můžete vytvořit v době, kdy vytváříte své prvky widget. To se obvykle děje u barev a písem. V jiných případech je vhodnější vytvářet grafické objekty za běhu. Můžete například vytvořit grafický kontext v jednom ze svých popisovačů událostí prvku widget, abyste provedli nějaké výpočty.
Pokud implementujete uživatelský prvek widget, zpravidla alokujete grafické objekty v konstruktoru, pokud je stále využíváte. Můžete je alokovat za běhu, pokud je stále nevyužíváte, nebo pokud jsou závislé na stavu nějakého atributu.
Jakmile jste alokovali své grafické objekty, můžete provést vykreslení. Vykreslování byste měli provádět vždy uvnitř listeneru vykreslování. Existují zřídkavé případy, zejména při implementování uživatelských prvků widget, kdy vykreslujete při reakci na nějakou jinou událost. To je ovšem obecně nevhodné. Pokud myslíte, že potřebujete vykreslovat během ošetřování nějaké jiné události, měli byste se nejdříve pokusit použít metodu redraw(), která vygeneruje jinou událost vykreslování v OS. Kreslení mimo metody vykreslování potlačuje optimalizaci platformy a může způsobit chyby v závislosti na počtu nevyřízených vykreslování ve frontě událostí.
Když přijmete událost vykreslování, bude vám dodán GC předkonfigurovaný pro kreslení v prvku widget. Tento GC neuvolňujte! Nevytvořili jste jej.
Všechny další grafické objekty musejí být alokovány při ošetřování události (nebo předem). Níže je uveden úsek kódu založený na ukázce org.eclipse.swt.examples.HelloWorld5. Červená barva byla alokována dříve při vytvoření prvku widget, takže zde může být použita.
shell.addPaintListener (new PaintListener () { public void paintControl (PaintEvent event) { GC gc = event.gc; gc.setForeground (red); Rectangle rect = event.widget.getClientArea (); gc.drawRectangle (rect.x + 10, rect.y + 10, rect.width - 20, rect.height - 20); gc.drawString (resHello.getString("Hello_world"), rect.x + 20, rect.y + 20); } });
Každý grafický objekt, který alokujete, musí být uvolněn, když jej přestanete používat.
Načasování zlikvidování závisí na tom, kdy jste objekt vytvořili. Pokud vytvoříte grafický objekt při vytváření prvku widget, obecně byste měli k tomuto prvku widget přidat listener zlikvidování a grafiku zlikvidovat, když se likviduje prvek widget. Pokud objekt vytvoříte za běhu během vykreslování, měli byste jej zlikvidovat po dokončení vykreslování.
Následující úsek kódu ukazuje mírně modifikovanou verzi vašeho listeneru vykreslování. V tomto příkladu alokuje a uvolní červenou barvu během vykreslování.
shell.addPaintListener (new PaintListener () { public void paintControl (PaintEvent event) { GC gc = event.gc; Color red = new Color (event.widget.getDisplay (), 0xFF, 0, 0); gc.setForeground (red); Rectangle rect = event.widget.getClientArea (); gc.drawRectangle (rect.x + 10, rect.y + 10, rect.width - 20, rect.height - 20); gc.drawString (resHello.getString ("Hello_world"), rect.x + 20, rect.y + 20); red.dispose (); } });