Problemer med programdele

Når du arbejder med en elementværktøjskasse, er det vigtigt, at du forstår den underliggende programdelmodel, der bruges til læsning og afsendelse af GUI-platformsaktiviteter. Implementeringen af UI-programdelen påvirker de regler, som programmer skal følge, når de bruger Java-programdele i deres kode.

Indbygget aktivitetsafsendelse

Under ethvert GUI-program, uanset sprog eller UI-værktøjskasse, finder styresystemplatformen GUI-aktiviteter og placerer dem i programaktivitetskøer. Selvom mekanikken er lidt forskellig på de forskellige styresystemplatforme, er det grundlæggende mønster ens. Når brugeren klikker med musen, skriver tegn eller arbejder i vinduer, opretter styresystemet GUI-programaktiviteter, f.eks. museklik, tasttryk eller vinduesmaling. Det bestemmer, hvilket vindue og program der skal modtage de enkelte aktiviteter, og placerer det i programmets aktivitetskø.

Den underliggende struktur for et GUI-program med vinduer er en aktivitetsløkke. Programmer initialiserer og starter derefter en løkke, som simpelthen læser GUI-aktiviteterne fra køen og reagerer i overensstemmelse hermed. Alt det arbejde, der udføres under håndtering af disse aktiviteter, skal ske hurtigt, så GUI-systemet opleves som hurtigt for brugeren.

Langvarige funktioner, der udløses af UI-aktiviteter, skal udføres i en separat programdel for at give programdelen med aktivitetsløkken mulighed for at vende hurtigt tilbage og hente den næste aktivitet fra programmets kø. Men adgangen til elementerne og platformens API fra andre programdele skal kontrolleres med eksplicit låsning og serialisering. Et program, der ikke følger disse regler, kan bevirke, at et styresystemkald ikke udføres, eller endnu værre: at hele GUI-systemet fastlåses.

SWT UI-programdel

SWT følger den programdelmodel, der understøttes direkte af platformene. Programmet kører aktivitetsløkken i hovedprogramdelen og afsender aktiviteter direkte fra denne programdel. UI-programdelen er den programdel, hvor fremvisningen (display) blev oprettet. Alle andre elementer skal oprettes i UI-programdelen.

Da al aktivitetskode udløses fra programmets UI-programdel, kan programkode, der håndterer aktiviteter, frit få adgang til elementerne og foretage grafikkald uden særlige teknikker. Men programmet er ansvarligt for gafling af beregningsprogramdele ved udførelse af langvarige funktioner som reaktion på en aktivitet.

Bemærk: SWT udløser en SWTException, hvis der modtages et kald fra en ikke-UI-programdel, og kaldet skulle komme fra UI-programdelen.

Hovedprogramdelen, inklusive aktivitetsløkken, for et SWT-program har følgende struktur:

   public static void main (String [] args) {
      Display display = new Display ();
      Shell shell = new Shell (display);
      shell.open ();
      // start aktivitetsløkke. Vi stopper, når brugeren har gjort
      // noget for at kassere vinduet.
      while (!shell.isDisposed ()) {
         if (!display.readAndDispatch ())
            display.sleep ();
      }
      display.dispose ();
   }

Når elementerne er oprettet, og shell'en er åbnet, læser og afsender programmet aktiviteter fra styresystemkøen, indtil shellvinduet er kasseret. Hvis der ikke er nogen tilgængelige aktiviteter i køen, beder vi fremvisningen (display) holde pause, så andre programmer får en chance for at blive udført.

SWT indeholder særlige adgangsmetoder til kald af element- og grafikkode fra en baggrundsprogramdel.

Udfør kode fra ikke-UI-programdel

Programmer, der vil kalde UI-kode fra en ikke-UI-programdel, skal levere en Runnable, der kalder UI-koden. Metoderne syncExec(Runnable) og asyncExec(Runnable) i klassen Display bruges til at udføre disse runnables i UI-programdelen under aktivitetsløkken.

Følgende kodestykke demonstrerer mønsteret for brug af disse metoder:

   // udfør tidskrævende beregninger
   ...
   // opdatér brugergrænseflade nu. Vi er ikke afhængige af resultatet,
   // så brug asynkron
   display.asyncExec (new Runnable () {
      public void run () {
         if (!myWindow.isDisposed())
            myWindow.redraw ();
      }
   });
   // udfør flere beregninger nu
   ...

Det er god praksis at kontrollere, om elementet kasseres fra den valgte runnable, når du anvender asyncExec. Da der kan ske andre ting i UI-programdelen mellem kaldet til asyncExec og udførelsen af en runnable, kan du aldrig være sikker på, hvilken tilstand dine elementer er i, når din runnable udføres.

Arbejdsbænken og programdele

Programdelsreglerne er meget klare, når du implementerer et SWT-program helt fra grunden, da du styrer oprettelsen af aktivitetsløkken og beslutningen om at gafle beregningsprogramdele i programmet.

Tingene bliver lidt mere komplicerede, når du leverer pluginkode til arbejdsbænken. Følgende regler kan betragtes som "magtanvendelsesregler", når der anvendes platformspecifikke UI-klasser, selvom der kan være undtagelser fra disse regler fra udgave til udgave: