Programmering

Introduktion til AWT

Java-programmeringssprogklassebiblioteket indeholder et værktøjssæt til brugergrænsefladen kaldet Abstract Windowing Toolkit eller AWT. AWT er både kraftfuld og fleksibel. Nybegyndere finder imidlertid ofte, at dens magt er tilsløret. Klasse- og metodebeskrivelserne, der findes i den distribuerede dokumentation, giver den nye programmør kun lidt vejledning. Desuden lader de tilgængelige eksempler ofte mange vigtige spørgsmål ubesvarede. Selvfølgelig bør nyankomne forvente nogle vanskeligheder. Effektive grafiske brugergrænseflader er i sagens natur udfordrende at designe og implementere, og de undertiden komplicerede interaktioner mellem klasser i AWT gør kun denne opgave mere kompleks. Med korrekt vejledning er oprettelsen af ​​en grafisk brugergrænseflade ved hjælp af AWT imidlertid ikke kun mulig, men relativt ligetil.

Denne artikel dækker noget af filosofien bag AWT og behandler den praktiske bekymring for, hvordan man opretter en simpel brugergrænseflade til en applet eller applikation.

Hvad er en brugergrænseflade

Brugergrænsefladen er den del af et program, der interagerer med brugeren af ​​programmet. Brugergrænseflader har mange former. Disse formularer varierer i kompleksitet fra enkle kommandolinjegrænseflader til peg-og-klik-grafiske brugergrænseflader, der leveres af mange moderne applikationer.

På det laveste niveau transmitterer operativsystemet information fra musen og tastaturet til programmet som input og giver pixels til programoutput. AWT blev designet således, at programmører ikke bekymrer sig om detaljerne i sporing af musen eller læsning af tastaturet og heller ikke tager sig af detaljerne i at skrive til skærmen. AWT giver en veldesignet objektorienteret grænseflade til disse tjenester og ressourcer på lavt niveau.

Da Java-programmeringssproget er platformuafhængigt, skal AWT også være platformuafhængigt. AWT blev designet til at tilvejebringe et fælles sæt værktøjer til grafisk brugergrænsefladesign, der fungerer på en række forskellige platforme. De brugergrænsefladeelementer, der leveres af AWT, implementeres ved hjælp af hver platforms oprindelige GUI-værktøjssæt, hvorved udseendet og følelsen af ​​hver platform bevares. Dette er en af ​​AWTs stærkeste punkter. Ulempen ved en sådan tilgang er det faktum, at en grafisk brugergrænseflade designet på en platform kan se anderledes ud, når den vises på en anden platform.

Komponenter og containere

En grafisk brugergrænseflade er bygget af grafiske elementer kaldet komponenter. Typiske komponenter inkluderer f.eks. Knapper, rullebjælker og tekstfelter. Komponenter giver brugeren mulighed for at interagere med programmet og give brugeren visuel feedback om programmets tilstand. I AWT er alle brugergrænsefladekomponenter forekomster af klasse Komponent eller en af ​​dens undertyper.

Komponenter står ikke alene, men findes snarere i containere. Beholdere indeholder og styrer layoutet af komponenter. Beholdere er i sig selv komponenter og kan således placeres i andre beholdere. I AWT er alle containere forekomster af klasse Container eller en af ​​dens undertyper.

Rumligt skal komponenter passe helt ind i beholderen, der indeholder dem. Denne indlejring af komponenter (inklusive beholdere) i containere skaber et træ af elementer, der starter med beholderen ved roden af ​​træet og udvider sig til bladene, som er komponenter såsom knapper.

Illustrationen i figur 1 viser en simpel grafisk brugergrænseflade, som den ville se ud, når den blev vist under Windows 95. Figur 2 viser interface-komponenterne fra figur 1 arrangeret som et træ.

Typer af komponenter

Figur 3 viser arveforholdet mellem de brugergrænsefladekomponentklasser, der leveres af AWT. Klassekomponent definerer det interface, som alle komponenter skal overholde.

AWT leverer ni grundlæggende ikke-container komponentklasser, hvorfra en brugergrænseflade kan konstrueres. (Naturligvis kan nye komponentklasser afledes fra en hvilken som helst af disse eller fra selve klasse Komponent.) Disse ni klasser er klasse Knap, lærred, afkrydsningsfelt, valg, etiket, liste, rullepanel, TextArea og TextField. Figur 4 viser en forekomst af hver klasse.

Du har brug for en Java-aktiveret browser for at se denne applet.

Figur 4.

Ni komponenter til brugergrænsefladen

Kilden til dette display findes her.

Typer af containere

AWT tilbyder fire containerklasser. De er klasse Window og dens to undertyper - klasse Frame og class Dialog - såvel som Panel-klassen. Ud over de containere, der leveres af AWT, er Applet-klassen en container - det er en undertype af Panel-klassen og kan derfor indeholde komponenter. Kort beskrivelse af hver containerklasse leveret af AWT er angivet nedenfor.

VindueEn skærmoverflade på øverste niveau (et vindue). En forekomst af Window-klassen er ikke knyttet til eller integreret i en anden container. En forekomst af Window-klassen har ingen kant og ingen titel.
RammeEn skærmoverflade på øverste niveau (et vindue) med en kant og titel. En forekomst af rammeklassen kan have en menulinje. Det ligner ellers meget en forekomst af Window-klassen.
DialogEn skærmoverflade på øverste niveau (et vindue) med en kant og titel. En forekomst af Dialog-klassen kan ikke eksistere uden en tilknyttet forekomst af Frame-klassen.
Panel

En generisk beholder til opbevaring af komponenter. En forekomst af Panel-klassen giver en container, som komponenter skal tilføjes til.

Oprettelse af en container

Inden de komponenter, der udgør en brugergrænseflade, tilføjes, skal programmøren oprette en container. Ved opbygning af et program skal programmøren først oprette en forekomst af klasse Window eller class Frame. Når du bygger en applet, findes der allerede en ramme (browservinduet). Da appletklassen er en undertype af panelklassen, kan programmøren føje komponenterne til forekomsten af ​​selve appletklassen.

Koden i liste 1 opretter en tom ramme. Titlen på rammen ("Eksempel 1") indstilles i kaldet til konstruktøren. En ramme er oprindeligt usynlig og skal synliggøres ved at påberåbe den at vise() metode.

import java.awt. *;

public class Eksempel1 {public static void main (String [] args) {Frame f = new Frame ("Eksempel 1");

f.show (); }}

Liste 1.

En tom ramme

Koden i Listing 2 udvider koden fra Listing 1, så den nye klasse arver fra class Panel. I hoved () metode oprettes en forekomst af denne nye klasse og føjes til rammeobjektet via et opkald til tilføje() metode. Resultatet vises derefter. Resultaterne af begge eksempler skal se identiske ud (dvs. de skal se ret uinteressante ud).

import java.awt. *;

public class Eksempel1a udvider Panel {public static void main (String [] args) {Frame f = new Frame ("Eksempel 1a");

Eksempel1a ex = nyt eksempel1a ();

f.add ("Center", ex);

f.pakke (); f.show (); }}

Liste 2.

En ramme med et tomt panel

Ved at udlede den nye klasse fra klasse-applet i stedet for klasse-panelet, kan dette eksempel nu køre som enten et enkeltstående program eller som en applet, der er integreret i en webside. Koden til dette eksempel findes i Listing 3. Den resulterende applet vises i figur 5 (og er stadig ret uinteressant).

import java.awt. *;

public class Eksempel1b udvider java.applet.Applet {public static void main (String [] args) {Frame f = new Frame ("Eksempel 1b");

Eksempel1b ex = nyt eksempel1b ();

f.add ("Center", ex);

f.pakke (); f.show (); }}

Liste 3.

En ramme med en tom applet

Du har brug for en Java-aktiveret browser for at se denne applet.

Figur 5.

En tom ramme

Bemærk: et vindueobjekt og i visse tilfælde endda et dialogobjekt kan erstatte rammeobjektet. De er alle gyldige containere, og komponenter føjes til hver på samme måde.

Tilføjelse af komponenter til en container

For at være nyttigt skal en brugergrænseflade bestå af mere end bare en container - den skal indeholde komponenter. Komponenter føjes til containere via en container tilføje() metode. Der er tre grundlæggende former for tilføje() metode. Metoden, der skal bruges, afhænger af containerens layoutmanager (se afsnittet med titlen Komponentlayout).

Koden i liste 4 tilføjer oprettelsen af ​​to knapper til koden, der vises i liste 3. Oprettelsen udføres i i det() metode, fordi den automatisk kaldes under initialisering af applet. Derfor, uanset hvordan programmet startes, oprettes knapperne, fordi i det() kaldes enten af ​​browseren eller af hoved () metode. Figur 6 indeholder den resulterende applet.

import java.awt. *;

offentlig klasse Eksempel 3 udvider java.applet.Applet {public void init () {add (new Button ("One")); tilføj (ny knap ("To")); }

offentlig dimension foretrukket størrelse () {returner ny dimension (200, 100); }

public static void main (String [] args) {Frame f = new Frame ("Eksempel 3");

Eksempel3 ex = nyt Eksempel3 ();

ex.init ();

f.add ("Center", ex);

f.pakke (); f.show (); }}

Liste 4.

En applet med to knapper

Du har brug for en Java-aktiveret browser for at se denne applet.

Figur 6.

En applet med to knapper

Komponentlayout

Indtil dette er der ikke blevet sagt noget om, hvordan komponenterne, der er føjet til en container, er lagt ud. Layout styres ikke af containeren, men af ​​en layoutmanager, der er knyttet til containeren. Layoutmanageren tager alle beslutningerne om placering af komponenter. I AWT implementerer alle layoutmanagerklasser LayoutManager-grænsefladen.

AWT tilbyder fem layoutledere. De spænder fra meget enkle til meget komplekse. Denne artikel dækker kun de to layoutmanagerklasser, der bruges af eksemplerne heri: FlowLayout-klassen og BorderLayout-klassen.

FlowLayout-klassen placerer komponenter i en container fra venstre mod højre. Når pladsen i en række er opbrugt, startes en anden række. Enargumentversionen af ​​en container tilføje() metoden bruges til at tilføje komponenter.

BorderLayout-klassen har fem zoner som vist i figur 7. Zonerne hedder "Nord", "Syd", "Øst", "Vest" og "Center". En enkelt komponent kan placeres i hver af disse fem zoner. Når størrelsen på den lukkende container er ændret, ændres størrelsen på hver kantzone lige nok til at holde komponenten placeret indeni. Overskydende plads gives til centerzonen. To-argument versionen af ​​en container tilføje() metoden bruges til at tilføje komponenter. Det første argument er et strengobjekt, der navngiver den zone, hvor komponenten skal placeres.

Hver containerklasse har en standardlayoutmanager. Standardlayoutmanageren for klassen Frame og Dialog er BorderLayout-manager. Standardlayoutmanageren for Panel-klassen (og Applet-klassen) er FlowLayout-manager.

Koden i Listing 5 bruger begge layoutadministratorer og inkluderer et par flere brugergrænsefladekomponenter. Resultatet vises i figur 8.

import java.awt. *;

offentlig klasse Eksempel 4 udvider java.applet.Applet {public void init () {Panel p;

setLayout (ny BorderLayout ());

p = nyt panel ();

p.add (ny TextArea ());

tilføj ("Center", p);

p = nyt panel ();

p.add (ny knap ("Én")); p.add (ny knap ("To"));

Valg c = nyt valg ();

c.addItem ("en"); c.addItem ("to"); c.addItem ("tre");

p.add (c);

tilføj ("Syd", p); }

public static void main (String [] args) {Frame f = new Frame ("Eksempel 4");

Eksempel4 ex = nyt Eksempel4 ();

ex.init ();

f.add ("Center", ex);

f.pakke (); f.show (); }}

Liste 5.

Et mere kompliceret eksempel

Du har brug for en Java-aktiveret browser for at se denne applet.

Figur 8.

Et mere kompliceret eksempel

Begivenhedshåndtering

Eksemplerne ovenfor gør intet andet end at vise en inaktiv brugergrænseflade. Det er selvfølgelig meget vigtigt, at en brugergrænseflade tager handling som et resultat af brugerinput. Det er imidlertid uden for anvendelsesområdet for denne artikel at gå dybt ned i mysterierne ved håndtering af begivenheder. Det må vente til en fremtidig artikel. Af hensyn til fuldstændighed viser eksemplet i kode 6 imidlertid, hvordan man håndterer en type begivenhed, som et program muligvis modtager. Den nye klasse tilsidesætter handling() metode leveret af komponentklassen. Det handling() metode reagerer på de handlingshændelser, der genereres, f.eks. ved valg af et element fra en pop op-liste. Det handling() Metoden kræver, at der leveres to parametre, en begivenhedsinstans og en objektforekomst. Begivenhedsforekomsten indeholder oplysninger om begivenheden, inklusive begivenhedens mål (den komponent, der først modtog begivenheden), begivenhedens x- og y-koordinater og tidspunktet for begivenheden. Objektforekomsten indeholder et hændelsesspecifikt stykke data. For knapobjekter indeholder den teksten i knapetiketten.

import java.awt. *;

offentlig klasse Eksempel 5 udvider java.applet.Applet {TextArea ta = null;

offentlig ugyldig init () {Panel p;

setLayout (ny BorderLayout ());

p = nyt panel ();

ta = ny TextArea ();

p.add (ta);

tilføj ("Center", p);

p = nyt panel ();

p.add (ny knap ("One")); p.add (ny knap ("To"));

Valg c = nyt valg ();

c.addItem ("en"); c.addItem ("to"); c.addItem ("tre");

p.add (c);

tilføj ("Syd", p); }

offentlig boolsk handling (Begivenhed e, Objekt o) {String str = (String) o;

ta.appendText (str + "\ n");

returner falsk; }

public static void main (String [] args) {Frame f = new Frame ("Eksempel 5");

Eksempel5 ex = nyt Eksempel5 ();

ex.init ();

f.add ("Center", ex);

f.pakke (); f.show (); }}

Liste 6.

Et eksempel med begivenhedshåndtering