Grafik

SWT indeholder et grafikprogram til tegning af grafik og fremvisning af billeder i elementer. Du kan komme temmelig langt uden overhovedet at programmere til grafikbrugerfladen, da elementer håndterer maling af ikoner, tekst og andre data. Men hvis dit program viser tilpasset grafik, eller hvis du implementerer et tilpasset tegnet element, har du brug for et grundlæggende kendskab til tegneobjekterne i SWT.

Grafikkontekst

Grafikkonteksten, GC (Graphics Context), er brændpunktet, når det gælder grafikunderstøttelse i SWT. Det tilhørende API beskriver alle tegnefunktionerne i SWT.

En GC kan bruges til at tegne på en kontrol (det mest almindelige), på et billede, på en fremvisning (display) eller til en printer. Når du tegner på en kontrol, kan du bruge den GC, der vises i kontrollens maleaktivitet. Når du tegner på et billede, på en fremvisning (display) eller til en printer, skal du oprette en GC, der er konfigureret til formålet, og kassere den, når du er færdig med at bruge den.

Så snart du har en GC, kan du angive dens attributter, f.eks. farve, stregtykkelse og font, hvilket styrer udseendet af den grafik, der tegnes i GC'en.

API-referencen til GC beskriver hele sættet af grafikfunktioner.

Fonte

Klasserne Font og FontData bruges ved manipulation af fonte i SWT.

FontData beskriver en fonts kendetegn. Du kan oprette en FontData-klasse ved at angive et fontnavn, en typografi og en størrelse. FontData inkluderer et API til at forespørge om disse attributter. Da FontData ikke allokerer nogen styresystemressourcer, behøver du ikke kassere den.

Font er det faktiske grafikobjekt, der repræsenterer en font, som bruges i tegnings-API'et. Du opretter en font til en fremvisning (display) ved at angive Display og FontData for den ønskede font. Du kan også forespørge en font om dens FontData.

Du skal kassere en allokeret font, når du er færdig med at bruge den.

Farver

Farver svarer til fonte. Du opretter en farve til en fremvisning (display) ved at angive RGB-værdierne for den ønskede farve. Du skal kassere en allokeret farve, når du er færdig med at bruge den.

Med Display-metoden getSystemColor(int) kan du forespørge om de foruddefinerede systemfarver for styresystemplatformen. Du bør ikke frigøre farver, du har hentet vha. denne teknik.

Farvemodellen er beskrevet detaljeret i artiklen SWT-farvemodel.

Billeder

Klasserne Image, ImageData og ImageLoader bruges ved vedligeholdelse af billeder i SWT.

ImageData beskriver de faktiske pixel i billedet og bruger klassen PaletteData til at beskrive de anvendte farveværdier. ImageData er en enheds- og platformsuafhængig beskrivelse af et billede.

ImageLoader indlæser og gemmer ImageData i forskellige filformater. SWT understøtter i øjeblikket indlæsning og lagring af billedformater, herunder BMP (Windows Bitmap), ICO (Windows-ikon), JPEG, GIF og PNG.

Image er det faktiske grafikobjekt, der repræsenterer det billede, som bruges i tegnings-API'et. Du opretter et billede for en bestemt fremvisning (display). Billeder kan oprettes på flere måder:

Uanset hvordan du opretter billedet, er du ansvarlig for at kassere det.

Livscyklus for grafikobjekter

De fleste grafikobjekter, der anvendes til tegning i SWT, allokerer ressourcer i det underliggende styresystem og skal eksplicit frigøres. Samme regel, som er beskrevet tidligere, gælder her. Hvis du opretter objektet vha. en konstruktør, skal du frigøre det. Hvis du får adgang til det fra et andet sted, skal du ikke frigøre det.

Oprettelse

Grafikobjekter, f.eks. grafikkontekster, fonte, farver og billeder, allokeres i styresystemet, så snart objektet oprettes. Den måde, du vil anvende grafikobjekterne på, bestemmer, hvornår du skal oprette dem.

Hvis grafikobjekterne skal bruges mange steder i programmet, kan du oprette dem på det tidspunkt, hvor du opretter elementerne. Dette gøres ofte for farver og fonte. I andre tilfælde er det mere relevant at oprette grafikobjekterne undervejs. Du kan f.eks. oprette en grafikkontekst i en af dine elementaktivitetsbehandlere for at udføre nogle beregninger.

Hvis du implementerer et tilpasset element, allokerer du typisk grafikobjekter i konstruktøren, hvis du altid anvender dem. Du kan allokere dem undervejs, hvis du ikke altid bruger dem, eller hvis de er afhængige af tilstanden af en attribut.

Maling

Når du har allokeret grafikobjekterne, er du klar til at male. Du bør altid male i en malelytter. Der er sjældne tilfælde, særligt ved implementering af tilpassede elementer, hvor du maler, mens du reagerer på en anden aktivitet. Men det frarådes generelt. Hvis du tror, du har brug for at male, mens du håndterer en anden aktivitet, bør du først forsøge at bruge metoden redraw(), som genererer en anden maleaktivitet i styresystemet. Tegning uden for malemetoden forhindrer platformsoptimeringer og kan forårsage fejl, afhængigt af antallet af ventende maleaktiviteter i køen.

Når du modtager en maleaktivitet, får du en GC, der er forudkonfigureret til tegning i elementet. Frigør ikke denne GC! Du har ikke oprettet den.

Andre grafikobjekter skal allokeres, mens aktiviteten håndteres (eller før). Herunder er et stykke, baseret på eksemplet org.eclipse.swt.examples.HelloWorld5. Farven rød blev allokeret tidligere, da elementet blev oprettet, så den kan bruges 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);
      }
   });

Bortskaffelse

Grafikobjekter, som du allokerer, skal frigøres, når du er færdige med at bruge dem.

Tidspunktet for bortskaffelse afhænger af, hvornår du har oprettet objektet. Hvis du opretter et grafikobjekt, mens du opretter elementet, bør du generelt tilføje en bortskaffelseslytter til elementet og kassere grafikken, når elementet kasseres. Hvis du opretter et objekt, mens du maler, bør du kassere det, når du er færdig med at male.

Næste kodestykke viser en lettere ændret udgave af malelytteren. I dette eksempel allokerer og frigør den farven rød, mens den maler.

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