GUI Nyckelbeståndsdelar Nyckelbeståndsdelar i ett grafiskt användargränssnitt i Java: GUI komponenter Layout hanterare (-manager) Händelsehantering (event processing) GUI komponenter är de element på skärmen som påverkas med mus och tangentbord Layout hanterare bestämmer hur komponenter organiseras på skärmen Events signalerar att interaktion har skett Programmeringsmetodik -Java 200
AWT Programmeringsmetodik -Java 201
Händelsestyrd Programmering Interaktionen i ett GUI är inte uppstyrd som t ex i laboration 1 Användaren kan interagera med valfri komponent i valfria kombinationer Ordningen av händelser kan inte förutbestämmas Komponenter genererar händelser om det händer någonting Programmeringsmetodik -Java 202
Händelsestyrd Programmering Olika komponenter genererar olika händelser: ActionEvent Button List MenuItem TextField Adjustment Event Scrollbar ItemEvent Checkbox Choice List... Programmeringsmetodik -Java 203
Händelsehantering Programmet måste kunna reagera på alla händelser som GUIet kan utlösa Speciella objekt, så kallade Listeners (lyssnare) väntar på händelser Om en händelse inträffar exekverar lyssnaren metoden som motsvarar händelsen: Programmeringsmetodik -Java 204
Klasshierarki för händelser Programmeringsmetodik -Java 205
Händelsehantering ActionListener actionperformed() AdjustmentListener adjustmentvaluechanged() ItemListener itemstatechanged() Mouse Listener mouseclicked() mouseentered() mouseexited() mousepressed() mousereleased() Alla metoder får händelsen som parameter Noggrann analys av händelsen är möjligt Programmeringsmetodik -Java 206
GUI Programmet GUI programmet består av: Koden som bygger upp GUIet och visar det för användaren Koden för lyssnare som väntar på händelser Koden som skall exekveras när ett händelse inträffar Lyssnare måste implementera ett listener interface listener interface för varje händelsetyp, t ex ActionEvent TextEvent MouseEvent Programmeringsmetodik -Java 207
Lyssnare I interfacet finns metoderna som måste realiseras för att hantera en viss typ av händelse Lyssnarna kopplas sen till GUI komponenter (och prenumererar på deras händelser) Om komponenten genererar en händelse exekveras motsvarande metod i lyssnaren Programmeringsmetodik -Java 208
Flera Lyssnare En lyssnare får implementera flera interface En lyssnare får kopplas till flera komponenter En komponent får ha flera lyssnare Varje klass kan lyssna till många eventtyper Programmeringsmetodik -Java 209
GUI Programöversikt Huvudprogrammet Instantierar GUIet (med sig själv som parameter) Implementerar aktioner till alla händelser GUIet Har konstruktor som tar huvudprogrammet som parameter koppling Instantierar lyssnare (med huvudprogrammet som parameter) Skapar och sätter ihop komponenterna Lyssnare Implementerar ett eller flera interface Anropar metoden i huvudprogrammet som implementerar aktionen till händelsen Programmeringsmetodik -Java 210
Container En container grupperar GUI komponenter Containrar är också komponenter, men inte tvärtom Alla GUI komponenter måste placeras i en container (annars kan de inte visas) Exempel på container klasser är tex Applet, Frame och Panel Knappar osv. kan visas i en applet Alla containrar har en Layout Manager som lägger fast hur komponenterna i containern organiseras Programmeringsmetodik -Java 211
Label En Label (etikett) är en statisk textrad En label kan inte selekteras eller modifieras av användaren Hanteringen av labels stöds av klassen Label (JLabel) Programmeringsmetodik -Java 212
Knappar Det finns fyra olika knapptyper: Push buttons (tryckknapp) Choice buttons (urvalsknappar) Checkbox buttons Radio buttons En tryckknapp är en vanlig knapp som kan tryckas (och sen händer nåt) Kolla Button (JButton) klassen för detaljer Programmeringsmetodik -Java 213
Knappar En urvalsknapp visar en lista med valmöjligheter när den trycks Kolla Choice (JComboBox) klassen för detaljer En Checkbox button kan vara från eller till Kolla Checkbox (JCheckbox) klassen för detaljer Programmeringsmetodik -Java 214
Knappar Radio buttons är en grupp av till/från knappar där bara en får vara vald Om en knapp selekteras byter de andra automatiskt till från-läget Kolla Checkbox och CheckboxGroup (JRadioButton &ButtonGroup) klasserna för detaljer Programmeringsmetodik -Java 215
Knappar Se Quotes.java [s. 419--423] för ett exempel med alla knapptyper Programmeringsmetodik -Java 216
FlowLayout Komponenter ordnas från vänster till höger i översta raden Om raden är full påbörjas en ny rad Komponenterna centreras i varje rad Programmeraren kan specificera mellanrum mellan komponenter och rader FlowLayout är default för panels och applets Programmeringsmetodik -Java 217
GridLayout Komponenter ordnas i rader och kolumner Alla celler har samma storlek I varje cell ryms precis en komponent Cellerna ifylls från vänster till höger och topdown Programmeringsmetodik -Java 218
BorderLayout North West Center East South Storlek av områdena beror på komponenterna som finns där (de får även vara tomma) Default för Frame och Window Ex för att lägga till en komponent: add(component1,borderlayout.center); Programmeringsmetodik -Java 219
BoxLayout En BoxLayout organiserar komponenterna antingen horisontellt (i en rad) eller vertikalt (i en kolumn) Särskilda tomma områden kan läggas till för att så att man får det mellanrum mellan komponenterna som man vill Genom att kombinera flera containers som använder sig av box layout, kan man skapa många olika utplaceringar av komponenterna Programmeringsmetodik -Java 220
Applets Laddas över nätverket Körs i en browser Säkerhetsaspekter Metoder Applets Programmeringsmetodik -Java 221
En Applet är en Component Programmeringsmetodik -Java 222
En Applet körs i en browser Browsern (Netscape, Explorer etc) laddar en applet över nätet när den hittar en <APPLET>-tag Tillhandahåller en grafisk miljö Skapar ett objekt av appletens klass tillåter inte vissa operationer av säkerhetsskäl Kan också köras i appletviewer Programmeringsmetodik -Java 223
Applets på nätet Programmeringsmetodik -Java 224
En applets livscykel Skapas av browsern Initieras endast en gång (är det meningen )! Startas varje gång sidan visas Stoppas när sidan lämnas Final cleanup när sidan tas bort ur minnet Programmeringsmetodik -Java 225
En applets anatomi public void init() public void start() public void stop() public void destroy(); public void paint(graphics g) men normalt ingen konstuktor! Programmeringsmetodik -Java 226
init() Initiering som inte tar så lång tid Innehåller normalt koden som skulle ha lagts i konstruktorn När konstruktorn körs är appleten inte garanterad en korrekt omgivning. Använd inte konstruktorer för applets Programmeringsmetodik -Java 227
start() Anropas varje gång användaren bläddrar fram till sidan Utför jobbet eller (troligare) startar en tråd (Thread) Programmeringsmetodik -Java 228
stop() Om start omdefinierats så är det bäst att ta med stop också Anropas när användaren bläddrar bort från sidan Stoppar beräkningar trådar animeringar (ingen kan se sidan ändå) Programmeringsmetodik -Java 229
destroy() Behöver normalt inte omdefinieras Stop tar hand om avslutningen destroy anropas innan appleten tas bort ur minnet Programmeringsmetodik -Java 230
paint(graphics g) Samma som paint i Frame sköter om all grafik Anropas via repaint Anropas från update som kan definieras om för bättre prestanda (dubbelbuffring) Programmeringsmetodik -Java 231
import java.awt.*; import java.applet.*; En liten applet public class LitenApplet extends Applet { Label field; public void init() { field= new Label("Hej!"); setlayout(new java.awt.flowlayout()); add(field); validate(); } } Programmeringsmetodik -Java 232
Doodle Doodle.java [s. 367-370] Programmeringsmetodik -Java 233
Vad applets inte kan En Applet kan inte ladda bibliotek eller native methods läsa eller skriva filer på klienten nätverksanslutningar annat än till sin egen server starta program på klienten läsa vissa systemegenskaper Applet fönster ser annorlunda ut Programmeringsmetodik -Java 234
Vad applets kan som inte En Applet kan applications kan spela ljudfiler (från och med Java 1.2 kan även applikationer detta) visa html-dokument prata med andra applets på samma sida Applets som laddas lokalt har inga begränsningar (eller behöver i alla fall inte ha det) Programmeringsmetodik -Java 235
Anrop <APPLET CODE=AppletSubclass.class WIDTH=anInt HEIGTH=anInt> </APPLET> <APPLET CODE= AppletSubclass.class ARCHIVE= file1, file2 WIDTH=anInt HEIGTH=anInt> </APPLET> Programmeringsmetodik -Java 236
Parametrar <APPLET CODE=AppletButton.class CODEBASE=example WIDTH=350 HEIGTH=60> <PARAM NAME=antal VALUE= 25 > <PARAM NAME=titel VALUE= Vi provar! > </APPLET> String title=getparameter( titel ); Programmeringsmetodik -Java 237
JukeBox Se JukeBox [s. 425-428] Programmeringsmetodik -Java 238
Exceptions Ett undantag (exception) är ett objekt som beskriver ett ovanligt eller felaktig situation Exceptions kastas av ett program, och kan fångas och hanteras av en annan del av programmet Ett program kan därför separeras i normalt programflöde och exception programflöde Ett fel (error) representeras också som ett objekt i Java, men representerar ofta en situation som inte går att återhämta sig ifrån och skall inte försöka hanteras Programmeringsmetodik -Java 239
Exceptions Ett program kan kan hantera ett exception på ett av följande tre sätt: Strunta i det Hantera det där det inträffar Hantera det på ett annat ställe i programmet Programmeringsmetodik -Java 240
Ignorerade undantag Om ett undantag ignoreras av programmet kommer programmet att avslutas och producera ett felmeddelande. Meddelandet innehåller en anropssekvens (call stack trace) som indikerar på vilken rad som undantaget inträffade. Anropssekvensen visar också vilken sekvens av metodanrop som ledde fram till exekveringen av raden som gav upphov till undantaget. Se Zero.java (s. 379) Programmeringsmetodik -Java 241
Hantera undantag lokalt För att hantera ett undantag där det inträffar så omsluter man satsen som kan generera undantaget I ett try block Ett try-block följs av ett eller flera catch satser, som innehåller kod för att hantera undantaget Varje catch-block har en typ av undantag associerade till sig. När ett undantag inträffar fortsätter programmet att exekvera det första catch blocket som har en matchande undantags typ. Programmeringsmetodik -Java 242
finally Ett try-block kan också följas av ett blockmarkerat av det reserverade ordet finally Om inget undantag genereras exekveras koden i finally-blocket efter att alla satser i try-blocket exekverats. Om ett undantag inträffar så exekveras koden i finally blocket efter att att satserna i matchande catch block exekverats. Programmeringsmetodik -Java 243
Hantering någon annanstans Om det inte är lämpligt att hantera undantaget där det inträffar kan det hanteras på en högre nivå. Undantag skickas (propagate) upp genom metodanrops hierarkin tills dess att de hanteras eller når den yttersta nivån Ett try-block som innehåller ett anrop till en metod som kan generera ett undantag kan användas för att fånga undantaget. Se Propagation.java (s.384-385) Programmeringsmetodik -Java 244
Egna undantag Man kan definiera egna undantag genom att ärva från någon av undantagsklasserna Exceptions kastas med hjälp av throw-satsen Throw-satsen finns i normala fall i en if-sats som kollar ifall undantaget skall kastas. Se CreatingExceptions.java (s. 388) Programmeringsmetodik -Java 245
Kontrollerade undantag Ett undantag är antingen kontrollerat(checked) eller okontrollerat (unchecked) Ett kontrollerat undantag kan endast kastas i ett try-block eller i en metod som explicit säger att den kastar detta undantag. Kompilatorn kommer att klaga om ett kontrollerat undantag inte hanteras korrekt. Ett okontrollerat undantag kräver ingen särskild hantering, men kan hanteras på samma sätt. Okontrollerade undantag är underklasser till Error eller RunTimeException. Övriga är kontrollerade. Programmeringsmetodik -Java 246
Strömmar Filhantering, utskrifter, inläsning m.m. hanteras i Java med s.k. strömmar (streams). Strömmar kan kopplas ihop som kedjor för att anpassa funktionaliteten efter sina egna behov. Finns två klasser av strömmar: bitströmmar - Ström för i huvudsak binärt data teckenströmmar - Ström för tecken och textsträngar Programmeringsmetodik -Java 247
Bitströmmar Alla bitströmmar är härledda från InputStream - ström för läsning OutputStream - ström för skrivning. Några vanliga bitströmmar är: FileInputStream BufferdInputStream ObjectInputStream Och motsvarande för OutputStream och dessutom PrintStream Programmeringsmetodik -Java 248
Teckenströmmar Teckenströmmar är härledda från: Reader -ström för läsning Writer - ström för skrivning Några vanliga teckenströmmar är: FileReader BufferedReader Och motsvarande för Writer och dessutom PrintWriter Programmeringsmetodik -Java 249
Exempel Öppna en textfil och skriva text till den // Öppna filen och skapa en ström till den. FileWriter fw = new FileWriter("MinFil.txt"); // För effektivitet använd en buffrad ström // och koppla den till filströmmen. BufferedWriter bw = new BufferedWriter(fw); // En anpassad ström för skriving är: PrintWriter pw = new PrintWriter(bw); // Skriv till filen. pw.println("innehåll i min första Java-fil"); // Stäng filen pw.close(); Programmeringsmetodik -Java 250
in, out, err I klassen System finns färdiga strömmar System.in - Läsning från tangentbordet (InputStream) System.out - Skrivning till skärm (PrintStream) System.err - Felmeddelanden (PrintStream) Koppla bit och teckenströmmar InputStreamReader isr = new InputStreamReader(System.in); BufferedReader stdin = new BufferedReader(isr); String s = stdin.readline(); Programmeringsmetodik -Java 251
Serialisering Objekt serialisering (Object serialization) är att spara ett objekt och dess tillstånd så att det kan användas senare i tex ett annat program Objekt serialisering sker med hjälp av klasserna ObjectOutputStream och ObjectInputStream Serialisering tar hänsyn till eventuella andra objekt som refereras av objektet som serialiseras och sparar dem också. Klassen måste implementera någon av gränssnitten Serializable eller Externalizable Programmeringsmetodik -Java 252
IO och Exceptions De flesta metoderna som har med strömmar att göra kastar undantag som måste hanteras Undantagen är i de flesta fall av typen IOException t.ex. FileNotFoundException Exempel: try { FileWriter fw = new FileWriter("MinFil.txt");... } catch(filenotfoundexception e) { System.err.println("MinFil.txt kunde inte öppnas"); } catch(ioexception e) { System.err.println("Följande fel inträffade: "+e); } Programmeringsmetodik -Java 253