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