Programmering

Introduksjon til AWT

Java-programmeringsspråkklassebiblioteket gir et brukergrensesnittverktøy kalt Abstract Windowing Toolkit, eller AWT. AWT er både kraftig og fleksibel. Nykommere finner imidlertid ofte at dens kraft er tilslørt. Klasse- og metodebeskrivelsene i den distribuerte dokumentasjonen gir liten veiledning for den nye programmereren. Videre gir de tilgjengelige eksemplene ofte mange viktige spørsmål ubesvarte. Selvfølgelig bør nykommere forvente noen vanskeligheter. Effektive grafiske brukergrensesnitt er iboende utfordrende å designe og implementere, og de til tider kompliserte interaksjonene mellom klassene i AWT gjør bare denne oppgaven mer kompleks. Imidlertid, med riktig veiledning, er det ikke bare mulig å opprette et grafisk brukergrensesnitt ved bruk av AWT, men relativt greit.

Denne artikkelen dekker noe av filosofien bak AWT og tar for seg den praktiske bekymringen for hvordan du lager et enkelt brukergrensesnitt for en applet eller applikasjon.

Hva er et brukergrensesnitt

Brukergrensesnittet er den delen av et program som samhandler med brukeren av programmet. Brukergrensesnitt har mange former. Disse skjemaene varierer i kompleksitet, fra enkle kommandolinjegrensesnitt til pek-og-klikk-grafiske brukergrensesnitt som tilbys av mange moderne applikasjoner.

På det laveste nivået overfører operativsystemet informasjon fra mus og tastatur til programmet som inngang, og gir piksler for programutgang. AWT ble designet slik at programmerere ikke trenger å bekymre seg for detaljene for å spore musen eller lese tastaturet, og ikke ta vare på detaljene for å skrive til skjermen. AWT gir et godt designet objektorientert grensesnitt til disse tjenestene og ressursene på lavt nivå.

Fordi Java-programmeringsspråket er plattformuavhengig, må AWT også være plattformuavhengig. AWT ble designet for å gi et felles sett med verktøy for grafisk design av brukergrensesnitt som fungerer på en rekke plattformer. Brukergrensesnittelementene som tilbys av AWT er implementert ved å bruke hver plattforms innebygde GUI-verktøy, og derved bevare utseendet og følelsen til hver plattform. Dette er et av AWTs sterkeste poeng. Ulempen med en slik tilnærming er det faktum at et grafisk brukergrensesnitt designet på en plattform kan se annerledes ut når det vises på en annen plattform.

Komponenter og beholdere

Et grafisk brukergrensesnitt er bygd av grafiske elementer som kalles komponenter. Typiske komponenter inkluderer elementer som knapper, rullefelt og tekstfelt. Komponenter lar brukeren samhandle med programmet og gi brukeren visuell tilbakemelding om tilstanden til programmet. I AWT er alle brukergrensesnittkomponenter forekomster av klasse Komponent eller en av dens undertyper.

Komponenter står ikke alene, men finnes i containere. Beholdere inneholder og kontrollerer utformingen av komponenter. Beholdere er i seg selv komponenter, og kan dermed plasseres i andre containere. I AWT er alle containere forekomster av klasse Container eller en av dens undertyper.

Romlig sett må komponentene passe helt inn i beholderen som inneholder dem. Denne nestingen av komponenter (inkludert beholdere) i beholdere skaper et tre av elementer, som begynner med beholderen ved roten av treet og utvides til bladene, som er komponenter som knapper.

Illustrasjonen i figur 1 viser et enkelt grafisk brukergrensesnitt slik det ville se ut når det ble vist under Windows 95. Figur 2 viser grensesnittkomponentene fra figur 1 ordnet som et tre.

Typer komponenter

Figur 3 viser arveforholdet mellom komponentklassene for brukergrensesnittet gitt av AWT. Klassekomponent definerer grensesnittet som alle komponenter må holde seg til.

AWT tilbyr ni grunnleggende ikke-container komponentklasser som brukergrensesnitt kan konstrueres fra. (Selvfølgelig kan nye komponentklasser stamme fra hvilken som helst av disse eller fra selve klassen Komponent.) Disse ni klassene er klasse Knapp, Lerret, Avkrysningsrute, Valg, Etikett, Liste, Rullefelt, TextArea og TextField. Figur 4 viser en forekomst av hver klasse.

Du trenger en Java-aktivert nettleser for å se denne appleten.

Figur 4.

Ni brukergrensesnittkomponenter

Kilden til denne skjermen finnes her.

Typer containere

AWT tilbyr fire containerklasser. De er klasse Window og dens to undertyper - klasse Frame og class Dialog - samt Panel-klasse. I tillegg til containerne som tilbys av AWT, er Applet-klassen en container - det er en undertype av Panel-klassen og kan derfor inneholde komponenter. Kort beskrivelse av hver containerklasse levert av AWT er gitt nedenfor.

VinduEn visningsflate på øverste nivå (et vindu). En forekomst av Window-klassen er ikke festet til eller innebygd i en annen container. En forekomst av Window-klassen har ingen rammer og ingen tittel.
RammeEn øverste nivå overflate (et vindu) med en kant og tittel. En forekomst av rammeklassen kan ha en menylinje. Det er ellers veldig likt en forekomst av Window-klassen.
DialogEn øverste nivå overflate (et vindu) med en kant og tittel. En forekomst av Dialog-klassen kan ikke eksistere uten en tilknyttet forekomst av Frame-klassen.
Panel

En generisk beholder for å holde komponenter. En forekomst av klassen Panel gir en beholder som komponenter skal legges til.

Opprette en container

Før du legger til komponentene som utgjør et brukergrensesnitt, må programmereren opprette en container. Når du bygger et program, må programmereren først opprette en forekomst av klasse Window eller class Frame. Når du bygger en applet, eksisterer det allerede en ramme (nettleservinduet). Siden Applet-klassen er en undertype av Panel-klassen, kan programmereren legge til komponentene i forekomsten av selve Applet-klassen.

Koden i oppføring 1 oppretter en tom ramme. Tittelen på rammen ("Eksempel 1") er angitt i anropet til konstruktøren. En ramme er i utgangspunktet usynlig og må synliggjøres ved å påberope den vise fram() metode.

importer java.awt. *;

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

f.show (); }}

Oppføring 1.

En tom ramme

Koden i Listing 2 utvider koden fra Listing 1 slik at den nye klassen arver fra class Panel. I hoved() metoden, opprettes en forekomst av denne nye klassen og legges til Frame-objektet via en samtale til legge til() metode. Resultatet vises deretter. Resultatene fra begge eksemplene skal se identiske ut (det vil si at de skal se ganske uinteressante ut).

importer java.awt. *;

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

Eksempel1a ex = nytt eksempel1a ();

f.add ("Center", ex);

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

Oppføring 2.

En ramme med et tomt panel

Ved å utlede den nye klassen fra klasse Applet i stedet for klasse Panel, kan dette eksemplet nå kjøres enten som et frittstående program eller som en applet innebygd på en webside. Koden for dette eksemplet er gitt i Listing 3. Den resulterende appleten vises i figur 5 (og er fortsatt ganske uinteressant).

importer java.awt. *;

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

Eksempel1b ex = nytt Eksempel1b ();

f.add ("Center", ex);

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

Oppføring 3.

En ramme med en tom applet

Du trenger en Java-aktivert nettleser for å se denne appleten.

Figur 5.

En tom ramme

Merk: et vindusobjekt, og i visse tilfeller til og med et dialogobjekt, kan erstatte rammeobjektet. De er alle gyldige beholdere, og komponenter blir lagt til hver på samme måte.

Legge til komponenter i en container

For å være nyttig må et brukergrensesnitt bestå av mer enn bare en container - det må inneholde komponenter. Komponenter legges til containere via en container legge til() metode. Det er tre grunnleggende former for legge til() metode. Metoden som skal brukes, avhenger av containerens layout manager (se avsnittet med tittelen Komponentoppsett).

Koden i oppføring 4 legger til opprettelsen av to knapper til koden som presenteres i oppføring 3. Opprettelsen utføres i i det() metoden fordi den blir ringt automatisk under initialisering av applet. Derfor, uansett hvordan programmet startes, blir knappene opprettet, fordi i det() kalles enten av nettleseren eller av hoved() metode. Figur 6 inneholder den resulterende appleten.

importer java.awt. *;

offentlig klasse Eksempel3 utvider java.applet.Applet {public void init () {add (new Button ("One")); legg til (ny knapp ("To")); }

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

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

Eksempel3 ex = nytt Eksempel3 ();

ex.init ();

f.add ("Center", ex);

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

Oppføring 4.

En applet med to knapper

Du trenger en Java-aktivert nettleser for å se denne appleten.

Figur 6.

En applet med to knapper

Komponentoppsett

Inntil dette har ingenting blitt sagt om hvordan komponentene som er lagt i en container er lagt ut. Oppsettet styres ikke av containeren, men av en layoutadministrator tilknyttet containeren. Layoutleder tar alle beslutninger om plassering av komponentene. I AWT implementerer alle layout manager klasser LayoutManager grensesnittet.

AWT tilbyr fem layoutledere. De spenner fra veldig enkle til veldig komplekse. Denne artikkelen dekker bare de to layoutmanagerklassene som brukes av eksemplene her: FlowLayout-klassen og BorderLayout-klassen.

FlowLayout-klassen plasserer komponenter i en container fra venstre til høyre. Når plassen i en rad er oppbrukt, startes en annen rad. Enargumentversjonen av en container legge til() metoden brukes til å legge til komponenter.

BorderLayout-klassen har fem soner som vist i figur 7. Sonene heter "Nord", "Sør", "Øst", "Vest" og "Senter". En enkelt komponent kan plasseres i hver av disse fem sonene. Når den lukkende beholderen er endret, endres størrelsen på hver randsone akkurat nok til å holde komponenten plassert i. Eventuell overflødig plass blir gitt til sentrumssonen. To-argument versjonen av en container legge til() metoden brukes til å legge til komponenter. Det første argumentet er et strengobjekt som navngir sonen komponenten skal plasseres i.

Hver containerklasse har en standard layout manager. Standard layout manager for Frame-klassen og Dialog-klassen er BorderLayout manager. Standard layout manager for Panel-klassen (og Applet-klassen) er FlowLayout manager.

Koden i Listing 5 bruker begge layoutadministratorer og inneholder noen flere brukergrensesnittkomponenter. Resultatet vises i figur 8.

importer java.awt. *;

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

setLayout (ny BorderLayout ());

p = nytt panel ();

p.add (ny TextArea ());

legg til ("Center", p);

p = nytt panel ();

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

Valg c = nytt Valg ();

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

p.add (c);

legg til ("Sør", p); }

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

Eksempel4 ex = nytt Eksempel4 ();

ex.init ();

f.add ("Center", ex);

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

Oppføring 5.

Et mer komplisert eksempel

Du trenger en Java-aktivert nettleser for å se denne appleten.

Figur 8.

Et mer komplisert eksempel

Hendelsesbehandling

Eksemplene ovenfor gjør ingenting mer enn å vise et inert brukergrensesnitt. Det er selvfølgelig veldig viktig at et brukergrensesnitt tar handling som et resultat av brukerinngang. Det er imidlertid utenfor omfanget av denne artikkelen å fordype seg dypt i mysteriene ved håndtering av hendelser. Det må vente til en fremtidig artikkel. Av hensyn til fullstendighet viser eksempelkoden i Oppføring 6 imidlertid hvordan man skal håndtere en type hendelse et program kan motta. Den nye klassen overstyrer handling() metoden som tilbys av komponentklassen. De handling() metoden svarer på handlingshendelsene som genereres, for eksempel ved valg av et element fra en popup-liste. De handling() metoden krever at to parametere leveres, en hendelsesforekomst og en objektforekomst. Hendelsesforekomsten inneholder informasjon om hendelsen, inkludert målet for hendelsen (komponenten som mottok hendelsen først), x- og y-koordinatene til hendelsen og tidspunktet da hendelsen skjedde. Objektforekomsten inneholder et hendelsesspesifikt stykke data. For knappobjekter inneholder den teksten i knappetiketten.

importer java.awt. *;

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

offentlig ugyldig init () {Panel p;

setLayout (ny BorderLayout ());

p = nytt panel ();

ta = ny TextArea ();

p.add (ta);

legg til ("Center", p);

p = nytt panel ();

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

Valg c = nytt Valg ();

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

p.add (c);

legg til ("Sør", p); }

offentlig boolsk handling (hendelse e, objekt o) {streng streng = (streng) o;

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

returner falsk; }

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

Eksempel5 ex = nytt Eksempel5 ();

ex.init ();

f.add ("Center", ex);

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

Oppføring 6.

Et eksempel med håndtering av hendelser

$config[zx-auto] not found$config[zx-overlay] not found