Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström 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 Sven-Olof Nyström 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 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström • 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 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström Komponenter i AWT Component Button TextComponent Checkbox Container Label List Scrollbar Canvas TextArea TextField Applet Objectorienterad programmering Panel Window ScrollPane Dialog Frame Sida 7 Swing Sven-Olof Nyström Komponenter i Swing Container(AWT) JComponent ... JSlider JScrollBar JScrollPane JTextComponent AbstractButton JPanel JLabel JToggleButton JButton JEditorPane JTextArea JTextField JRadioButton JCheckBox Objectorienterad programmering Sida 8 Swing Sven-Olof Nyström Komponenter i Swing (forts) Window(AWT) Applet(AWT) Frame(AWT) Dialog(AWT) JApplet JWindow JFrame Objectorienterad programmering JDialog Sida 9 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström Container: Utseende En mängd metoder, tex background(Color), getBackground() setForeground(Color), getForeground() setFont(Font), getFont() setBorder(Border), getBorder() Objectorienterad programmering Sida 18 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström Olika typer av händelser (forts) • KeyEvent (tangenttryckning) – e.getKeyCode() vilken tangent – e.getKeyChar() vilket tecken – e.getComponent() Objectorienterad programmering Sida 26 Swing Sven-Olof Nyström Händelser: ett enkelt exempel Program: HandelseTest.java, MouseTest.java Objectorienterad programmering Sida 27 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström Exempel: Ett enkelt ritprogram Program: Prickar.java Objectorienterad programmering Sida 31 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström Klassen InputStream, några metoder int read() läser en byte (-1 om strömmen slut) int read(byte[] buffer) läser bytes in i en buffer long skip(long n) skippar (högst) n byte, returnera hur mång void close () stäng strömmen Objectorienterad programmering Sida 34 Swing Sven-Olof Nyström Klassen Reader int read() läser ett tecken int read(char[] buffer) läser in tecken i en buffer long skip(long n) skippar (högst) n tecken. void close () stäng strömmen Objectorienterad programmering Sida 35 Swing Sven-Olof Nyström Klassen OutputStream void flush() tömmer alla buffrar och ser till att utskriften når sitt mål void close() stänger strömmen void write(int b) skriver en byte void write(byte [] b) skriver en array av bytes Objectorienterad programmering Sida 36 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström Definiera egna filter • Exempel: FilterReader • (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 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström Andra filter BufferedReader(Reader in) BufferedWriter(Writer out) LineNumberReader(Reader in) PushbackReader(Reader in) Objectorienterad programmering Sida 40 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström Andra strömmar (forts) • ObjectInputStream(InputStream in) Läser godtyckliga objekt! • ObjectOutputStream(OutputStream in) Skriver godtyckliga objekt! Objectorienterad programmering Sida 42 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström Lite om Unicode • Plattformsoberoende • 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 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström 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 Swing Sven-Olof Nyström 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