Grafikk

SWT inneholder en grafikkmotor for tegning av grafikk og visning av bilder i widgeter. Du kan komme nokså langt uten å programmere grafikkgrensesnittet siden widgeter håndterer fargelegging av objekter, tekst og andre data. Hvis applikasjonen viser tilpasset grafikk eller hvis du implementerer en widget som du har tegnet selv, må du ha noen grunnleggende tegneobjekter i SWT.

Grafikkontekst

Grafikkonteksten GC er det sentrale punktet for SWTs grafikkstøtte. Programmeringsgrensesnittet beskriver alle tegnemuligheter i SWT.

Det kan brukes en GC (grafikkontekst) til å tegne i en kontroll (dette er det vanligste), på et bilde, i en visning eller til en skriver. Når du tegner i en kontroll, bruker du den GC som er oppgitt i kontrollens tegningshendelse. Når du tegner på et bilde, en visning eller til en skriver, må du opprette og konfigurere en GC for dette formålet og slette den når du er ferdig med å bruke den.

Når du har en GC, kan du definere attributtene som styrer utseende til grafikken i GC, for eksempel farge, linjebredde og font.

API-referansen for GC beskriver det komplette settet med grafikkfunksjoner.

Fonter

Klassene Font og FontData brukes til å manipulere fonter i SWT.

FontData beskriver egenskapene for en font. Du kan opprette FontData ved å angi et fontnavn, stil og størrelse. FontData omfatter et programmeringsgrensesnitt for spørring etter disse attributtene. Siden FontData ikke tildeler operativsystemressurser, behøver du ikke å slette den.

Font er det faktiske grafikkobjektet som representerer en font som brukes i tegneprogrammeringsgrensesnittet. Du kan opprette en font for en Display ved å angi Display og FontData for fonten du vil bruke. Du kan også sende en spørring om FontData til Font.

Du må slette en tildelt font når du er ferdig med å bruke den.

Farger

Farger minner om fonter. Du oppretter Color for en Display ved å angi RGB-verdiene for ønsket farge. Du må slette en tildelt farge når du er ferdig med å bruke den.

Med Display-metoden getSystemColor(int) kan du utføre en spørring etter de forhåndsdefinerte systemfargene for operativsystemplattformen. Ikke frigi farger som du har fått ved å bruke denne metoden.

Fargemodellen beskrives nærmere i artikkelen SWT color model.

Bilder

Klassene Image, ImageData og ImageLoader brukes når du manipulerer bilder i SWT.

ImageData beskriver pikslene i bildet ved hjelp av klassen PaletteData, for å beskrive hvilke fargeverdier som er brukt. ImageData er en enhets- og plattformuavhengig beskrivelse av et bilde.

ImageLoader laster inn og lagrer ImageData i ulike filformater. SWT støtter for øyeblikket lasting og lagring av bildeformater inkludert BMP (Windows Bitmap), ICO (Windows Icon), JPEG, GIF og PNG.

Image er grafikkobjektet som representerer bildet som brukes i programmeringsgrensesnittet for tegning. Du oppretter et bilde for en bestemt Display. Bilder kan opprettes på flere måter:

Uansett hvordan du oppretter bildet er det ditt ansvar å slette det.

Levetid for grafikkobjekter

De fleste grafikkobjekter som brukes til å tegne i SWT, tildeler ressurser i det underliggende operativsystemet og må frigjøres eksplisitt. Her gjelder samme regel som vi har sett tidligere. Hvis du oppretter objektet ved hjelp av en konstruktør, må det frigjøres. Hvis du får tilgang til objektet fra et annet sted, skal det ikke frigjøres.

Opprettelse

Grafikkobjekter som grafikkontekster, fonter, farger og bilder tildeles i operativsystemet så snart objektet opprettes. Hvordan du har tenkt å bruke grafikkobjektene bestemmer når de skal opprettes.

Hvis grafikkobjektene brukes hyppig i applikasjonen, kan du opprette dem samtidig som du oppretter widgetene. Dette gjøres vanligvis for farger og fonter. I andre klasser er det mer hensiktsmessig å opprette grafikkobjekter etter behov. Du kan for eksempel opprette en grafikkontekst i en av hendelsesstyrerne for widgetene slik at det kan utføres visse beregninger.

Hvis du implementerer en tilpasset widget, kan du vanligvis tildele grafikkobjekter i konstruktøren hvis du alltid bruker dem. Du kan tildele dem umiddelbart hvis du ikke bruker dem hele tiden, eller hvis de er avhengige av tilstanden i en bestemt attributt.

Fargelegging

Når du har tildelt grafikkobjektene, er du klar til å fargelegge. Fargeleggingen skal alltid utføres i en fargeleggingslytter. I spesielle tilfeller, spesielt ved implementering av tilpassede widgeter, kan du fargelegge samtidig som du svarer på en annen hendelse. Dette frarådes imidlertid vanligvis. Hvis du vil fargelegge samtidig som du håndterer andre hendelser, bør du først prøve å bruke redraw()-metoden som genererer en annen fargeleggingshendelse i operativsystemet. Tegning utenfor fargeleggingsmetoden innvirker på plattformoptimaliseringer og kan forårsake feil avhengig av antall ventende fargelegginger i hendelseskøen.

Når du mottar en fargeleggingshendelse får du en GC som er forhåndskonfigurert for tegning i widgeten. Ikke frigjør denne GC! Det var ikke du som opprettet den.

Det må ikke tildeles grafikkobjekter samtidig som hendelsen håndteres (eller før). Nedenfor ser du en snutt for eksempelet org.eclipse.swt.examples.HelloWorld5. Fargen rød ble tidligere tildelt ved opprettelse av widgeten, så den kan brukes her.

   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);
      }
   });

Sletting

Du må frigjøre alle grafikkobjekter som er tildelt når du er ferdig med å bruke dem.

Tidspunktet for fjerning av objektet, avhenger av når du opprettet objektet. Hvis du oppretter et grafikkobjekt samtidig som du oppretter widgeten, skal du vanligvis legge til en slettelytter i widgeten og slette grafikken når widgeten slettes. Hvis du oppretter et objekt samtidig som du utfører en fargelegging, skal det slettes når du er ferdig med fargeleggingen.

Kodesnutten nedenfor viser en noe modifisert versjon av fargeleggingslytteren. I dette eksempelet tildeles og frigis fargen rød ved fargeleggingen.

   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 ();
      }
   });