Swing och AWT Fem typer av klasser GUI-komponenter Layout-hanterare Händelser och händelselyssnare Klasser för grafik och bildhantering Objectorienterad programmering Sida 1
AWT AWT = Abstract windowing toolkit använder värddatorns fönstersystem (och ärver därigenom look and feel ) En minsta gemensam nämnare tillåter bara de operationer som definieras i samtliga fönstersystem (Windows, Mac, Unix...) Man kan till exempel inte ha en knapp med en bild. Objectorienterad programmering Sida 2
Swing och AWT (forts) Swing: Helt skrivet i Java Swing definierar motsvarigheter till nästan alla AWTs komponenter + några klasser till Klasserna i Swing ärver från klasser i AWT Swing definierar sitt eget utseende. Man kan välja look and feel oberoende av värddator. Objectorienterad programmering Sida 3
Grafiska användarinterface (GUI) Vad består ett GUI av? En pekare pil som styrs av användaren. fönster och ikoner som skapas av en applikation. Diverse komponenter, till exempel knappar, skjutreglage, textfält, bilder 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. Objectorienterad programmering Sida 4
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). Objectorienterad programmering Sida 5
Design av ett GUI: Två problem Presentera information från programmet Ta emot information från användaren (musrörelser, klickningar och tangenttryckningar) Objectorienterad programmering Sida 6
Komponenter i AWT Component Button TextComponent Checkbox Container Label List Scrollbar Canvas TextArea TextField Panel Window ScrollPane Applet Dialog Frame Objectorienterad programmering Sida 7
Komponenter i Swing Container(AWT) JComponent... JSlider JScrollBar JScrollPane JTextComponent AbstractButton JPanel JLabel JEditorPane JTextArea JTextField JToggleButton JButton JRadioButton JCheckBox Objectorienterad programmering Sida 8
Komponenter i Swing (forts) Window(AWT) Applet(AWT) Frame(AWT) Dialog(AWT) JWindow JFrame JDialog JApplet Objectorienterad programmering Sida 9
Klassen Component Klassen Component har metoder för Uppritning: paint(graphics), update(graphics), repaint() Händelsehantering (senare föreläsning) Egenskaper: färg - setforeground(color),..., typsnitt - setfont(font), Font getfont() storlek - setsize(int w, int h),... position - setlocation(int x, int y),..., Objectorienterad programmering Sida 10
Om AWT och Swing (forts) Vissa av klasserna svarar mot igenkännbara komponenter, tex Frame, JFrame ett fönster (med kanter och titelrad) Dialog, JDialog ett dialogfönster för tillfälliga meddelanden Button, JButton klickbara knappar CheckBox, JCheckBox en ruta som användaren markerar för att göra ett visst val Label, JLabel en enkel text eller bild Objectorienterad programmering Sida 11
Om AWT och Swing (forts) Andra klasser beskriver interna strukturer som inte är direkt synliga för användaren, tex Component Se ovan Container Beskriver vanligen en yta som andra komponenter kan placeras på. JWindow ett fristående fönster på skärmen, utan kanter och titelrad. JComponent Superklassen för (nästan) alla komponenter i Swing. Motsvarar klasserna Component och Container i Objectorienterad programmering Sida 12
AWT. Förutom funktionaliteten från Component och Container hanterar JComponent ramar, tips (en slags hjälpfunktioner), hantering av tangenttryckningar. JPanel En rektangulär yta på skärmen. Beskriver en del av ett fönster. Man kan använda ett system av JPanel-objekt för att beskriva en komplicerad layout. JScrollPane Rymmer en enda komponent. Om storleken för den komponent som lagras är större än JScrollPane-objektet, adderas skjutreglage så att man kan se hela objektet. Objectorienterad programmering Sida 13
Några hjälpklasser Dimension Höjd och bredd Color Färg Font Olika typsnitt, tex new Font... Border Ramar Graphics Ett slags ritverktyg som skickas som parameter till metoder som ritar upp en komponent Layout Beskriver hur komponenter ska placeras på en yta Objectorienterad programmering Sida 14
En närmare titt på Container, JComponent och JWindow Förenklad klassstruktur Container JComponent JFrame,JWindow JDialog, JInternalFrame [Diverse verktyg och skrivytor] Objectorienterad programmering Sida 15
Container En container kan innehålla andra komponenter (barnkomponenter). Motsats: föräldrakomponenter add(x) adderar en komponent add(n, x) för att placera komponent vid viss position remove(x) för att ta bort getparent() för att ta fram föräldern Objectorienterad programmering Sida 16
Container (forts) För att placera en komponent b i ett fönster w (tex JFrame), skriv w.getcontentpane().add(b) getcontentpane plockar fram en särskild arbetsyta. Objectorienterad programmering Sida 17
Container: Utseende En mängd metoder, tex background(color), getbackground() setforeground(color), getforeground() setfont(font), getfont() setborder(border), getborder() Objectorienterad programmering Sida 18
Container: Layout I stället för att använda (tex) koordinater, låt en layouthanterare placera ut komponenterna. Ger en design som fungerar bra på olika typer av skärmar, om användaren ändrar storlek etc. BorderLayout FlowLayout GridLayout BoxLayout cardlayout Objectorienterad programmering Sida 19
Layout: exempel c.setlayout(new BorderLayout()) bestämmer layoutstrategi för en container. För att placera nåt på den övre delen, skriv c.add("north",...); Program: VisaBorderLayout.java, VisaBorderLayout2.java, VisaBorderLayout2.java Objectorienterad programmering Sida 20
Exempel: Kalkylator En kalkylator består av två delar; ett sifferfönster och en knappsats. Konstruera knappsatsen med gridlayout och placera sifferfönstret och knappsatsen med borderlayout. Programexempel: Kalk.java Liknar en kalkylator, men designen är inte helt lyckad. Försök 2, med snyggare knappar. kalk2.java Objectorienterad programmering Sida 21
Interaktion Användaren kommunicerar med fönstersystemet via klick och musrörelser. 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? Objectorienterad programmering Sida 22
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. Objectorienterad programmering Sida 23
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() Objectorienterad programmering Sida 24
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. Objectorienterad programmering Sida 25
Olika typer av händelser (forts) KeyEvent (tangenttryckning) e.getkeycode() vilken tangent e.getkeychar() vilket tecken e.getcomponent() Objectorienterad programmering Sida 26
Händelser: ett enkelt exempel Program: HandelseTest.java, MouseTest.java Objectorienterad programmering Sida 27
Exempel: Kalkylator Utöka kalkylatorexemplet (från tidigare föreläsning) så att man kan räkna på den! Vad behöver göras? Snygga upp designen. Skriv händelselyssnare som talar om vad knapparna gör. Definiera motsvarande operationer i kalkylatorn. Objectorienterad programmering Sida 28
Kalkylatorexemplet Idéer: Bygg en separat klasshierarki för de olika knapparna. Undvik allt för tät koppling mellan knapparna och kalkylatorn. Definiera knapparna utanför kalkylatorn. Objectorienterad programmering Sida 29
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: Kalk3.java, Kalk4.java Objectorienterad programmering Sida 30
Exempel: Ett enkelt ritprogram Program: Prickar.java Objectorienterad programmering Sida 31
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. Objectorienterad programmering Sida 32
Strömmar och IO Strömmar InputStream OutputStream Läser och skriver strömmar av bytes. Reader Writer Läser och skriver strömmar av char (Unicode). Objectorienterad programmering Sida 33
Klassen InputStream, några metoder int read() int read(byte[] buffer) long skip(long n) void close () läser en byte (-1 om strömmen slut) läser bytes in i en buffer skippar (högst) n byte, returnera hur mång stäng strömmen Objectorienterad programmering Sida 34
Klassen Reader int read() int read(char[] buffer) long skip(long n) void close () läser ett tecken läser in tecken i en buffer skippar (högst) n tecken. stäng strömmen Objectorienterad programmering Sida 35
Klassen OutputStream void flush() void close() void write(int b) void write(byte [] b) tömmer alla buffrar och ser till att utskriften når sitt mål stänger strömmen skriver en byte skriver en array av bytes Objectorienterad programmering Sida 36
Exempel Inläsning från terminalfönster Utskrift till fil Läs in fil... 1. med InputStream 2. med Reader 3. med try-catch 4. med BufferedReader Objectorienterad programmering Sida 37
Exempel: FilterReader Definiera egna filter (Finns motsvarande för de antra tre typerna av strömmar) En abstrakt klass, ärver Reader En konstruktor, som tar Reader som argument Objectorienterad programmering Sida 38
Egna filter (forts) En protected instansvariabel in (den ström som filtreras) samma metoder som Reader För att konvertera från stora till små bokstäver räcker det om man definierar ett filter som överskuggar (overrides) metoderna för läsning. ToLowerCaseReader.java, UpperToLower.java Objectorienterad programmering Sida 39
Andra filter BufferedReader(Reader in) BufferedWriter(Writer out) LineNumberReader(Reader in) PushbackReader(Reader in) Objectorienterad programmering Sida 40
Andra strömmar DataInputStream(InputStream is) Läser olika datatyper, tex readboolean() readchar() readint() DataOutputStream(OutputStream is) Skriver primitiva datatyper, tex writeboolean(boolean b), writechar(char c), writeint(int i) new PipedInputStream() new PipedOutputStream(PipedInputStream p) kopplar ihop två strömmar Objectorienterad programmering Sida 41
Andra strömmar (forts) ObjectInputStream(InputStream in) Läser godtyckliga objekt! ObjectOutputStream(OutputStream in) Skriver godtyckliga objekt! Objectorienterad programmering Sida 42
Serialisering Klasserna ObjectInputStream och ObjectOutputStream kan användas för att läsa och skriva (nästan) vilka objekt som helst. Operationer: void writeobject(object o) skriver ett objekt Object readobject() läser ett objekt Objectorienterad programmering Sida 43
Serialisering (forts) Krav: readobject och writeobject kräver att objektet tillhör en klass som implementerar interfacet Serializable Om in och out är av klasserna InputStream och OutputStream, skriv ObjectInputStream sin = new ObjectInputStream(in); ObjectOutputStream sout = new ObjectOutputStream(out); för att skapa strömmar som kan läsa och skriva objekt. Exempel: SeriTest1.java, SeriTest2.java Objectorienterad programmering Sida 44
Plattformsoberoende Lite om Unicode Mål: kunna koda alla världens språk (inklusive utdöda) en char är 16 bitar (= 65536 tecken). Nån som tror att det räcker? Objectorienterad programmering Sida 45
Unicode (forts) Unicode kan representera mer än en miljon tecken minsta datatypen i Java som kodar alla tecken är int. För att slippa använda 32 bitar för varje tecken använder man olika avkodningar (encodings), tex UTF-8, UTF-16, UTF-16BE, UTF16LE, UTF-32 Dessa kodar unicode till en sekvens av bytes, 16-bitars ord eller 32-bitars ord. Objectorienterad programmering Sida 46
Unicode (forts) Det finns också ofullständiga avkodningar. Java-system kan generera utskrift till följande format: US-ASCII och ISO-8859-1. Under Unix är ISO-8859-1 default. Genom optionen -encoding kan man även styra vilken kodning kompilatorn använder. (Exempel) Objectorienterad programmering Sida 47
Unitest, provkörning harpo$ java5 Unitest får us-ascii [66, 3f, 72] harpo$ java5 Unitest får iso-8859-1 [66, e5, 72] harpo$ java5 Unitest får utf-8 [66, c3, a5, 72] harpo$ java5 Unitest får utf-16 [fe, ff, 0, 66, 0, e5, 0, 72] harpo$ java5 Unitest får utf-16le [66, 0, e5, 0, 72, 0] harpo$ java5 Unitest får utf-32 Exception in thread "main" java.io.unsupportedencodingexception: utf-32 Objectorienterad programmering Sida 48