GUI (forts) Objektorienterad programmering med Java Swing: Händelser, lyssnare och applets Sven-Olof Nyström Uppsala Universitet 18 mars 2005 Skansholm: Kapitel 6 Användaren kan kommunicera med programmet genom att göra val på menyer, klicka på knappar, fylla i textrutor etc. Varje operation som användaren utför kan få programmet att göra olika saker. Viktig aspekt: Användaren bestämmer i vilken ordning olika operationer ska utföras (i motsats till ett textorienterat interface). Hur tar programmet emot interaktion från användaren? 1 3 Grafiska användarinterface (GUI) Byggstenarna i ett GUI... En pil som styrs av användaren, fönster och ikoner som skapas av en applikation, diverse komponenter, till exempel knappar, skjutreglage, textfält,... Användaren kommunicerar med fönstersystemet via klick och musrörelser. Användaren kan tex flytta omkring fönster på skärmen påverkar ej applikationen. GUI: Typiska klasser och interface för interaktion AWTEvent Abstrakt klass. Representerar en händelse. ActionEvent Subklass till AWTEvent. Denna brukar genereras vid knapptryckningar etc. (knapp = klassen Button) ActionListener Interface. En klass som hanterar ActionEvents måste implementera detta gränssnitt. MouseListener Interface. Används om man vill fånga upp mushändelser direkt. MouseAdapter Abstrakt klass. Implementerar MouseListener. Definierar tomma metoder för alla metoder i MouseListener. 2 4
Scenario för enkel interaktion Användaren klickar på ett fönster Händelsen representeras med ett objekt i klassen AWTEvent Swing tar reda på motsvarande komponent genom en sökning i trädet av komponenter och anropar dess händelselyssnare med händelsen som argument. Den anropade metoden tolkar händelsen genom att utföra önskade operationer och om fönstrets utseende ändrats, anropar repaint() Olika typer av händelser (forts) KeyEvent (tangenttryckning) e.getkeycode() vilken tangent e.getkeychar() vilket tecken e.getcomponent() 5 7 Händelser Olika typer av händelser, tex MouseEvent e.getx(), e.gety() ger koordinater e.clickcount() antal musklick e.getcomponent() ger den komponent som musen befinner sig i. Händelser: ett enkelt exempel Program: HandelseTest.java 6 8
Exempel: Kalkylator Utöka kalkylatorexemplet (från tidigare föreläsning) så att man kan räkna på den! Vad behöver göras? Skriv händelselyssnare som talar om vad knapparna gör. 9 11 Kalkylator: Händelselyssnare En lokal klass AddSiffra som hanterar inmatning av siffror. Händelselyssnaren anropas när användaren klickar på en siffertangent. En lokal klass AddOp vars händelselyssnare anropas när användaren klickar på någon av + - * / eller =. Komplikation: operationen ska utföras först när det andra argumentet har matats in. 10 12
Kalkylatorexemplet Kommentar: Egentligen inget bra exempel på objekt-orienterad programmering... Idéer: Bygg en separat klasshierarki för de olika knapparna. Exempel: Ett enkelt ritprogram Undvik allt för tät koppling mellan knapparna och kalkylatorn. Definiera knapparna utanför kalkylatorn, istället för att göra dem till lokala klasser. 13 15 Knappar: Klasshierarki Knapp Abstrakt klass, superklass för övriga knappar SifferKnapp Ärver av Knapp. Varje instans av klassen svarar mot en siffertangent. OpKnapp Abstrakt klass. Superklass för +*-/= PlusKnapp Plustangent. [Och så vidare] Program: Kalylator2.java 14 16
En texteditor Program: Prickar.java Det är lätt att skriva en basal texteditor i Java. Man använder helt enkelt en instans av klassen TextField för själva redigeringen. Dessutom krävs möjligheter att läsa in och spara filer. Knappar för detta placerar vi i en meny. Program: TextEdit.java 17 19 Prickar: Kommentarer Notera: Interface MouseListener kräver att ett antal metoder för olika mushändelser definieras. Dessa har egentligen inte så mycket med vårt problem att göra. Klassen MouseAdapter implementerar MouseListener och definierar alla metoder (med tom kropp). Genom att ärva från MouseAdapter slipper man definiera en massa metoder som man ändå inte använder. Ett enkelt ritprogram Scribble.java implementerar en applet i AWT. Scribble2.java. Lite mer sofistikerad. Bilden försvinner inte om fönstret skyms. Scribble3.java. Som applikation. Scribble4.java. Menyer för att spara och läsa in filer. Sparar med DataOutputStream. Scibble5.java. Sparar med ObjectOutputStream. 18 20
Sammanfattning Användaren bestämmer i vilken ordning saker ska ske ett klick i ett fönster ger ett anrop till motsvarande händelselyssnare en händelselyssnare är ett objekt som skapats för detta ändamål när du kodar händelselyssnaren bestämmer du vad som ska hända i en viss situation 21