Widget-työkaluja käytettäessä on tärkeää ymmärtää taustalla oleva säiemalli, jonka avulla käyttöympäristön graafisen käyttöliittymän tapahtumia luetaan ja lähetetään. Käyttöliittymäsäikeiden toteutus vaikuttaa sääntöihin, joita sovellusten on noudatettava, kun niiden koodissa käytetään Java-säikeitä.
Olipa graafisen käyttöliittymän sovelluksen kieli tai työkaluohjelmisto mikä tahansa, kaikkien graafisen käyttöliittymän sovellusten taustalla käyttöjärjestelmä havaitsee käyttöliittymän tapahtumat ja sijoittaa ne sovellusten tapahtumajonoihin. Eri käyttöjärjestelmissä on hieman erilainen mekaniikka, mutta niiden perustiedot vastaavat toisiaan. Kun käyttäjä napsauttaa hiiren painiketta, kirjoittaa merkkejä tai liikuttaa hiirtä ikkunassa, käyttöjärjestelmä luo sovelluksen graafisen käyttöliittymän tapahtumia, kuten hiiren napsautuksia, näppäinpainalluksia tai ikkunan maalaustapahtumia. Se määrittää, minkä ikkunan ja sovelluksen tulee vastaanottaa mikäkin tapahtuma, ja sijoittaa tapahtumat sovellusten tapahtumajonoihin.
Kunkin ikkunoita sisältävän graafisen käyttöliittymäsovelluksen pohjalla oleva rakenne on tapahtumasilmukka. Sovellukset alustavat ja aloittavat silmukan, joka lukee jonosta graafisen käyttöliittymän tapahtumia ja toimii niiden mukaan. Tapahtumien käsittelyn yhteydessä tehtävät työt on suoritettava nopeasti, jotta graafisen käyttöliittymän järjestelmä jatkaa käyttäjän toimiin vastaamista.
Jos käyttöliittymän tapahtumat saavat aikaan pitkiä toimintoja, ne tulee suorittaa erillisessä säikeessä, jotta tapahtumasilmukan säie voi palata nopeasti ja hakea sovellusjonon seuraavan tapahtuman. Widget-objektien ja käyttöympäristön sovellusohjelmaliittymien käyttöä muista säikeistä käsin tulee kuitenkin hallita erillisellä lukituksella ja sarjoituksella. Jos sovellus ei noudata näitä sääntöjä, käyttöjärjestelmän kutsu saattaa epäonnistua tai pahimmillaan koko graafinen käyttöliittymäjärjestelmä saattaa lukittua.
SWT noudattaa käyttöympäristöjen suoraan tukemaa säiemallia. Sovellusohjelma ajaa tapahtumasilmukan pääsäikeessään ja välittää tapahtumat suoraan tästä säikeestä. Käyttöliittymän säie on säie, jossa Display-olio on luotu. Kaikki muut widget-objektit tulee luoda käyttöliittymän säikeessä.
Sovelluksen käyttöliittymäsäie liipaisee kaikki tapahtumakoodit, joten tapahtumia käsittelevä sovelluskoodi voi vapaasti käsitellä widget-objekteja ja tehdä grafiikkakutsuja ilman erityistekniikkaa. Sovellus on kuitenkin vastuussa siitä laskentasäikeiden haarautuksesta, kun suoritettavana on pitkiä toimintoja vastauksena tapahtumaan.
Huomautus: SWT liipaisee SWTException-poikkeuksen kaikille sellaisille kutsuille, jotka on tehty muusta kuin käyttöliittymäsäikeestä ja jotka on tehtävä käyttöliittymäsäikeestä.
SWT-sovelluksen pääsäikeellä, joka sisältää tapahtumasilmukan, on seuraava rakenne:
public static void main (String [] args) { Display display = new Display (); Shell shell = new Shell (display); shell.open (); // aloittaa tapahtumasilmukan. Lopetetaan, kun käyttäjä on tehnyt // jotakin ikkunan hävittämiseksi. while (!shell.isDisposed ()) { if (!display.readAndDispatch ()) display.sleep (); } display.dispose (); }
Kun widget-objektit on luotu ja komentoliittymä avattu, sovellus lukee ja lähettää tapahtumat käyttöjärjestelmän jonosta, kunnes komentoliittymän ikkuna hävitetään. Jos jonossa ei ole tapahtumia käytettävissä, display-luokalle annetaan käsky siirtyä lepotilaan (sleep-metodi), jotta muut sovellukset voidaan ajaa.
SWT-ympäristössä on erityisiä käyttömetodeita, joilla voidaan kutsua widget- ja grafiikkakoodia taustasäikeestä.
Jos sovellukset haluavat kutsua käyttöliittymän koodia muusta kuin käyttöliittymän säikeestä, niiden on toimitettava Runnable-objekti, joka kutsuu käyttöliittymän koodia. Display-luokan syncExec(Runnable)- ja asyncExec(Runnable)-metodeita käytetään näiden runnable-objektien suoritukseen tapahtumasilmukan aikana.
Seuraava koodikatkelma esittelee mallin, jonka mukaan näitä metodeita käytetään:
// tehdään aikaa vaativia laskutoimituksia ... // päivitetään käyttöliittymä. Toiminta ei ole riippuvainen tuloksesta, // joten käytetään async-metodia. display.asyncExec (new Runnable () { public void run() { if (!myWindow.isDisposed()) myWindow.redraw (); } }); // tehdään lisää laskutoimituksia ...
Kun asyncExec-metodia käytetään, on hyvä tarkistaa, onko widget-objekti hävitetty runnable-objektista. Käyttöliittymän säikeessä voi tapahtua asyncExec
-kutsun ja runnable-objektin suorituksen välissä muitakin asioita, joten widget-objektin tilasta ei voi olla varmuutta runnable-objektin suorituksen aikana.
Säiesäännöt ovat hyvin selviä, kun SWT-sovellus toteutetaan alusta alkaen, sillä tällöin koodin kirjoittaja hallitsee tapahtumasilmukan luontia ja päätöstä laskentasäikeiden haarauttamisesta sovelluksessa.
Tilanne muuttuu hieman hankalammaksi, jos toimitat lisäosan koodia työympäristöön. Seuraavia sääntöjä kannattaa noudattaa käyttöympäristön käyttöliittymäluokkia käytettäessä, joskin eri laitoksissa saattaa olla poikkeuksia näihin sääntöihin: