SWT innehåller en grafikmotor för att rita och visa bilder i en gränssnittskontroll. Du kan komma ganska långt utan ett någonsin behöva programmera grafikgränssnittet eftersom gränssnittskontroller hanterar uppritning av ikoner, text och andra data. Om tillämpningen däremot visar egen grafik eller om du implementerar ett egenritad gränssnittskontroll, måste du känna till vissa grundläggande ritobjekt i SWT.
Grafikkontexten, grafikkontext, är den centrala punkten för SWT:s grafiksupport. I API:t beskrivs alla ritmöjligheter i SWT.
En grafikkontext kan användas till att rita på en kontroll (det vanligaste), en bild, en skärm eller en skrivare. När du ritar på en kontroll använder du den grafikkontext som finns i kontrollens uppritningshändelse. När du ritar på en bild, skärm eller skrivare måste du skapa och konfigurera en grafikkontext för detta och ta bort den när du är klar.
När du har en grafikkontext kan du ange attributen, t.ex. färg, linjebredd och teckensnitt, som styr utseendet på den bild som ritas i grafikkontexten.
I API-referens för grafikkontext beskrivs den kompletta uppsättningen grafikfunktioner.
Klasserna Font och FontData används när du manipulerar teckensnitt i SWT.
Med FontData beskrivs teckensnittets egenskaper. Du kan skapa en FontData genom att ange namn, stil och storlek på ett teckensnitt. FontData innehåller API för frågor mot de här attributen. Eftersom FontData inte allokerar några resurser i operativsystemet behöver du inte ta bort den.
Font är det verkliga grafikobjektet som representerar ett teckensnitt som används i rit-API:t. Du skapar en Font för en Display genom att ange Display och FontData för det teckensnitt du vill använda. Du kan också köra frågor mot en Font beträffande FontData.
Du måste ta bort en allokerad Font när du är klar.
Färger påminner om teckensnitt. Du skapar en Color för en Display genom att ange RGB-värdena för den färg du vill ha. Du måste ta bort en allokerad färg när du är klar.
Med Display-metoden getSystemColor(int)
kan du fråga efter fördefinierade systemfärger för plattformen. Du bör inte frigöra färger som du har fått på det här sättet.
Färgmodellen beskrivs i detalj i artikeln SWT-färgmodell.
Klasserna Image, ImageData och ImageLoader används när du manipulerar bilder i SWT.
Med ImageData beskrivs de faktiska bildpunkterna i bilden med hjälp av klassen PaletteData för att beskriva utnyttjade färgvärden. ImageData är en enhets- och plattformsoberoende bildbeskrivning.
Med ImageLoader inläses och sparas ImageData i olika filformat. SWT stöder för tillfället inläsning och sparande av bilder i exempelvis följande format BMP(Windows-bitmapp), ICO (Windows-ikon), JPEG, GIF och PNG.
Image är det faktiska grafikobjekt som representerar den bild som används i rit-API:t. Du skapar en bild för en viss Display. Bilder kan skapas på flera olika sätt:
Oavsett hur bilden skapades är du ansvarig för att ta bort den.
De flesta grafiska objekt som används för att rita i SWT allokerar resurser i underliggande operativsystem och måste frisläppas uttryckligen. Samma regel som nämnts tidigare gäller också här. Om du skapar den med hjälp av en konstruktor är det du som ska frisläppa den. Om någon ger dig access till den är det inte du som ska frisläppa den.
Grafikobjekt som t.ex. grafikkontexter, teckensnitt, färger och bilder allokeras i operativsystemet så snart objektet skapas. Hur du tänker använda dina grafikobjekt bestäms när du skapar dem.
För grafikobjekt som används ofta i tillämpningen kan du skapa dem samtidigt som du skapar dina gränssnittskontroller. Detta görs vanligen för färger och teckensnitt. I andra fall är det mer lämpligt att skapa grafikobjekten när de behövs. Du kan t.ex. skapa en grafikkontext i en av dina gränssnittskontrollhanterare för vissa beräkningar.
Om du implementerar en anpassad gränssnittskontroll allokerar du vanligen grafikobjekt i konstruktorn, om du alltid använder dem. Du kan allokera dem i förbifarten om du inte använder dem hela tiden eller om de är beroende av läget i ett visst attribut.
När du har allokerat dina grafikobjekt kan du börja rita upp. Du bör alltid rita upp inuti en uppritningslyssnare. Det finns sällsynta fall, speciellt vid implementering av anpassade gränssnittskontroller, då du kan rita upp medan du svarar på någon händelse. Detta uppmuntras vanligen inte. Om du tror att du måste rita upp medan du hanterar någon annan händelse bör du först försöka använda redraw()-metoden som genererar en annan uppritningshändelse i operativsystemet. Ritning utanför uppritningsmetoden inverkar på plattformsoptimeringar och kan orsaka fel, beroende på antalet pågående uppritningar i händelsekön.
När du tar emot en uppritningshändelse får du en grafikkontext som har förkonfigurerats för ritning i gränssnittskontrollerna. Frisläpp inte denna grafikkontext! Det var inte du som skapade den.
Alla andra grafikobjekt måste allokeras vid hantering av händelsen (eller i förväg). Här följer ett kodstycke som baseras på exemplet org.eclipse.swt.examples.HelloWorld5. Färgen röd har allokerats tidigare, när gränssnittskontrollen skapades, och kan användas här.
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); } });
Alla grafikobjekt du allokerar måste frisläppas när du har slutat använda dem.
När du tar bort dem beror på när du skapade objektet. Om du skapar ett grafikobjekt samtidigt som du skapar dingränssnittskontroll bör du vanligen lägga till en borttagslyssnare i gränssnittskontrollen och ta bort grafiken när gränssnittskontrollen tas bort. Om du skapar ett objekt i förbifarten medan du ritar upp bör du ta bort det när du är klar med uppritningen.
I nästa kodstycke visas en något ändrad version av vår uppritningslyssnare. I det här exemplet allokeras och frisläpps färgen röd vid uppritning.
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 (); } });