De SWT bevat een grafische engine voor het maken en weergeven van afbeeldingen in widgets. U kunt ver komen zonder een grafische interface te programmeren, omdat widgets het afbeelden van pictogrammen, tekst en andere gegevens voor u afhandelen. Als de toepassing echter aangepaste afbeeldingen moet weergeven of als u een aangepaste widget implementeert, moet u enige basistekenobjecten in de SWT kennen.
De grafische context, GC, is een kernpunt voor de grafische ondersteuning in de SWT. De API beschrijft alle tekenmogelijkheden van de SWT.
U kunt een GC gebruiken voor het tekenen op een besturingselement (wat het meest voorkomt), van een afbeelding, in een venster of om de gegevens naar een printer te sturen. Als u op een besturingselement tekent, moet de GC beschikbaar zijn in de paint-event van het besturingselement. Als u op een afbeelding of een scherm teken of tekeninformatie naar een printer stuurt, moet u er een GC voor configureren en deze verwijderen als u ermee klaar bent.
Als u een GC hebt gemaakt, kunt u de en instellen, bijvoorbeeld de kleur, lijndikte en het lettertype. Hiermee wordt het uiterlijk van het tekenwerk in de GC bepaald.
De API-documentatie over de GC bevat een volledige set grafische functies.
De klassen Font en FontData worden gebruikt bij het werken met lettertypen in de SWT.
FontData beschrijft de kenmerken van een lettertype. U kunt een FontData maken door een naam, stijl en grootte op te geven. FontData bevat een API voor het uitvoeren van een query op de kenmerken. Omdat FontData geen resources van het besturingssysteem toewijst, hoeft u deze niet te verwijderen.
Font is een grafisch object van een lettertype dat wordt gebruikt in de teken-API. U maakt een Font voor een Display door de Display en FontData op te geven van het gewenste lettertype. U kunt in een lettertype ook zoeken op de FontData.
U moet een toegewezen lettertype verwijderen als u ermee klaar bent.
Het werken met kleuren lijken op het werken met lettertypen. U maakt een Color-item voor schermweergave door de RGB-waarden van e gewenste kleur op te geven. U moet een toegewezen kleur verwijderen als u ermee klaar bent.
Met de Display-methode getSystemColor(int)
kunt u een query uitvoeren op de voorgedefinieerde systeemkleuren in het platform. U mag geen kleuren vrijgeven die u met deze methode hebt opgehaald.
Het kleurmodel wordt in detail besproken in het artikel SWT-kleurmodel.
De klassen Image, ImageData en ImageLoader worden gebruikt bij het werken met afbeeldingen in SWT.
ImageData beschrijft de feitelijke pixels in de afbeelding. Hierbij wordt de klasse PaletteData gebruikt om de gebruikte kleurwaarden te beschrijven. ImageData is een apparaat- en platformonafhankelijke beschrijving van een afbeelding.
ImageLoader laadt ImageData en slaat deze in verschillende bestandsindelingen op. De SWT ondersteunt momenteel het laden en opslaan van afbeeldingsindelingen als BMP (Windows Bitmap), ICO (Windows Icon), JPEG, GIF en PNG.
Image is een grafisch object van een afbeelding dat wordt gebruikt in de teken-API. U maakt en afbeelding voor een bepaalde Display. Afbeeldingen kunnen op verschillende manieren worden gemaakt:
U bent verantwoordelijk voor het verwijderen van de afbeelding, ongeacht hoe u deze maakt.
De meeste grafische tekenobjecten in de SWT wijzen resources in het onderliggende besturingssysteem toe en moeten expliciet worden vrijgegeven. De eerder besproken regel is ook hier van toepassing. Als u het object maakt met een constructor, moet u het vrijgeven. Als u toegang vanuit een andere locatie krijgt, hoeft u het niet vrij te geven.
Grafische objecten als grafische contexten, lettertypen, kleuren en afbeeldingen worden in het besturingssysteem toegewezen zodra ze worden gemaakt. Het hangt van uw planning voor gebruik af, wanneer u ze moet maken.
Grafische objecten die in de gehele toepassing veel worden gebruikt, kunnen worden gemaakt op het moment dat u uw widgets maakt. Dit wordt meestal bij kleuren en lettertypen gedaan. In andere gevallen is het gepaster om de grafische objecten op een specifiek moment te maken. U kunt bijvoorbeeld een grafische context in een van de widgeteventhandlers maken om een berekening uit te voeren.
Als u een aangepaste widget hebt geïmplementeerd en u de grafische objecten altijd nodig hebt, wijst u deze normaal gesproken toe in de constructor. U kunt ze op een specifiek moment toewijzen als u ze niet altijd gebruikt of als ze afhankelijk zijn van de status van een kenmerk.
Als u de grafische objecten hebt toegewezen, kunt u de vlakken gaan opvullen. Het opvullen van vlakken dient altijd in de paint-listener te gebeuren. Er zijn uitzonderlijke gevallen, met name bij het implementeren van aangepaste widgets, waarin vlakken worden gevuld als reactie op een andere event. Dit wordt doorgaans afgeraden. Als u een vlakopvulling nodig denkt te hebben terwijl u een andere event afhandelt, moet u eerst proberen de methode redraw() te gebruiken. Hiermee wordt een andere paint-event in het besturingssysteem gegenereerd. Tekenen buiten de paint-methode om heeft een nadelig effect op de platformprestaties en kan afhankelijk van het aantal opvulacties in de wachtrij problemen veroorzaken.
Als u een paint-event ontvangt, krijgt u een GC die voorgeconfigureerd is voor tekenen in de widget. Geef deze GC niet vrij! U hebt hem niet zelf gemaakt.
Eventuele andere grafische objecten moeten worden toegewezen tijdens het afhandelen van de event (of daarvoor). Hieronder ziet u een codefragment dat is gebaseerd op het voorbeeld org.eclipse.swt.examples.HelloWorld5. De kleur rood is eerder toegewezen toen de widget werd gemaakt en kan hier dus worden gebruikt.
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); } });
Alle grafische objecten die u toewijst, moet worden vrijgegeven als u ermee klaar bent.
Het moment van verwijdering hangt af van het moment waarop u het object hebt gemaakt. Als u een grafisch object maakt tijdens het maken van een widget, moet u over het algemeen een verwijderingslistener toevoegen en de afbeeldingen verwijderen als de widget wordt verwijderd. Als u een object op een specifiek moment tijdens de vlakopvulling maakt, moet u dit na afloop verwijderen.
In het volgende codefragment ziet u een enigszins aangepaste versie van de paint-listener. In het voorbeeld wijst deze tijdens de vlakopvulling de kleur rood toe en geeft deze vervolgens vrij.
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 (); } });