SWT-ympäristössä on grafiikkaperusosa, jonka avulla widget-objekteissa voi piirtää grafiikkaa ja näyttää kuvia. Grafiikkakäyttöliittymää ei välttämättä tarvitse ohjelmoida, sillä widget-objektit käsittelevät kuvakkeiden, tekstin ja muiden tietojen maalauksen. Jos sovelluksessa kuitenkin näytetään mukautettua grafiikkaa tai jos toteutat mukautetun piirretyn widget-objektin, tarvitset tietoa SWT-piirustusobjektien perusteista.
Grafiikkakonteksti GC on SWT-grafiikkatuen tärkein osa. Sen API-kuvauksessa on tietoja kaikista SWT-grafiikkatoiminnoista.
Grafiikkakontekstin avulla grafiikkaa voi lisätä ohjausobjektiin (yleisin käyttötapa), kuvaan, näyttöön tai tulostimeen. Kun grafiikkaa lisätään ohjausobjektiin, käytetään ohjausobjektin maalaustapahtumaan liittyvää grafiikkakontekstia. Kun grafiikkaa lisätään kuvaan, näyttöön tai tulostimeen, on ensin luotava kohteeseen liittyvä grafiikkakonteksti ja poistettava konteksti, kun sen käyttö on lopetettu.
Kun grafiikkakonteksti on käytössä, voit määrittää sen ominaisuudet, kuten värin, viivan leveyden ja fontin, jotka määrittävät grafiikkakontekstissa piirretyn grafiikan ulkoasun.
GC-kohteen API-tiedoissa on kuvattu kaikki grafiikkafunktiot.
Font- ja FontData-luokkia käytetään fonttien käsittelyyn SWT-ympäristössä.
FontData-luokka kuvaa fontin ominaisuudet. Voit luoda FontData-olion määrittämällä fontin nimen, tyylin ja koon. FontData-luokkaan liittyy sovellusohjelmaliittymä, jonka avulla voi lähettää näihin ominaisuuksiin liittyviä kyselyitä. FontData-olio ei varaa käyttöjärjestelmän resursseja, joten sitä ei tarvitse poistaa.
Font-luokka on varsinainen graafinen objekti, joka edustaa grafiikan sovellusohjelmaliittymässä käytettyä fonttia. Voit luoda Display-luokalle Font-olion määrittämällä haluamasi fontin Display- ja FontData-tiedot. Voit myös lähettää Font-luokkaan kyselyn sen FontData-tiedoista.
Varattu Font-olio on poistettava, kun sen käyttö on lopetettu.
Värit vastaavat fontteja. Display-luokalle luodaan Color-luokka määrittämällä halutun värin RGB-arvot. Varattu Color-olio on poistettava, kun sen käyttö on lopetettu.
Display-luokan getSystemColor(int)
-metodin avulla voit lähettää kyselyn käyttöjärjestelmään ennalta määritetyistä väreistä. Tällä menetelmällä saatuja värejä ei pidä vapauttaa.
Värimalli on kuvattu tarkasti englanninkielisessä artikkelissa SWT color model.
Image-, ImageData- ja ImageLoader-luokkia käytetään kuvien käsittelyyn SWT-ympäristössä.
ImageData-luokka kuvaa kuvan varsinaiset kuvapisteet käyttämällä PaletteData-luokkaa, joka kuvaa käytetyt väriarvot. ImageData-luokka on kuvan kuvaus, joka ei ole riippuvainen laitteesta eikä käyttöympäristöstä.
ImageLoader-luokka lataa ja tallentaa ImageData-tiedot eri tiedostomuotoja käyttäen. SWT-ympäristö tukee muun muassa seuraavien kuvatiedostomuotojen latausta ja tallennusta: BMP (Windows-bittikartta), ICO (Windows-kuvake), JPEG, GIF ja PNG.
Image-luokka on varsinainen graafinen objekti, joka edustaa grafiikan sovellusohjelmaliittymässä käytettyä kuvaa. Kuva luodaan tiettyä Display-luokkaa varten. Kuvia voi luoda monilla tavoilla:
Luotiinpa Image-olio millä tavalla tahansa, se on myös poistettava.
Useimmat SWT-ympäristössä käytetyt grafiikkaobjektit varaavat taustalla olevia käyttöjärjestelmän resursseja, ja ne on erikseen vapautettava. Aiemmin kuvattu sääntö pätee tässäkin. Jos kohde luodaan konstruktorin avulla, se on vapautettava. Jos kohteeseen muodostetaan yhteys toisaalta, sitä ei tarvitse vapauttaa.
Grafiikkakontekstit, fontit, värit, kuvat ja muut grafiikkaobjektit varataan käyttöjärjestelmässä heti, kun objekti on luotu. Grafiikkaobjektien aiottu käyttötapa määrittää sen, milloin ne tulee luoda.
Jos joitakin grafiikkaobjekteja käytetään sovelluksessa paljon, ne voi luoda widget-objektien luonnin yhteydessä. Näin toimitaan yleensä värien ja fonttien kanssa. Muissa tapauksissa on parempi luoda grafiikkaobjektit käytön aikana. Widget-tapahtumankäsittelijään voidaan esimerkiksi luoda grafiikkakonteksti laskutoimitusten suoritusta varten.
Jos toteutat mukautettua widget-objektia, grafiikkaobjektit varataan yleensä konstruktorissa, jos niitä käytetään aina. Ne voi varata käytön aikana, jos niitä ei aina käytetä tai jos ne ovat riippuvaisia jonkin määritteen tilasta.
Kun olet varannut grafiikkaobjektit, voit aloittaa maalauksen. Maalaus tulee aina tehdä maalauksen kuuntelutoiminnon sisällä. Joissakin harvoissa tilanteissa, erityisesti mukautettuja widget-objekteja toteutettaessa, maalaus tehdään vastauksena johonkin toiseen tapahtumaan. Yleensä tätä tulee kuitenkin välttää. Jos arvelet, että maalausta on ehkä tehtävä toisen tapahtuman käsittelyn aikana, kannattaa ensin yrittää käyttää redraw()-metodia, joka luo käyttöjärjestelmään toisen maalaustapahtuman. Jos piirtometodin ulkopuolella piirretään, käyttöympäristön optimoinneista ei ole hyötyä ja ympäristössä saattaa aiheutua virheitä sen mukaan, paljonko tapahtumajonossa on odottavia maalaustapahtumia.
Kun maalaustapahtuma vastaanotetaan, sen mukana tulee grafiikkakonteksti (GC), joka on ennalta määritetty widget-objektissa piirtoa varten. Älä vapauta tätä grafiikkakontekstia! Et ole luonut sitä.
Muut grafiikkaobjektit on varattava tapahtuman käsittelyn yhteydessä (tai aiemmin). Seuraava katkelma perustuu org.eclipse.swt.examples.HelloWorld5-erimerkkiin. Punainen väri (red) on varattu aiemmin widget-objektin luonnin yhteydessä, joten sitä voi käyttää tässä.
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); } });
Kukin varattu grafiikkaobjekti on vapautettava, kun sen käyttö on lopetettu.
Poiston ajastus määräytyy sen mukaan, milloin objekti on luotu. Jos grafiikkaobjekti luodaan widget-objektin luonnin yhteydessä, widget-objektiin tulee yleensä lisätä poiston kuuntelutoiminto, jolloin grafiikka voidaan poistaa widget-objektin poiston yhteydessä. Jos luot objektin maalattaessa käytön aikana, se tulee poistaa, kun maalaus lopetetaan.
Seuraavassa koodikatkelmassa on maalauksen kuuntelutoiminnon hieman muutettu versio. Tässä esimerkissä kuuntelutoiminto varaa ja vapauttaa punaisen värin (red) maalauksen yhteydessä.
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 (); } });