Objektorienterad programmering med Java Swing
Sven-Olof Nyström Uppsala Universitet
March 14, 2006 Skansholm: Kapitel 6
1
Programexempel
• Hello.java, Hej2.java
• Kvadrat.java
• Hello.html (enkel html)
• Direkt3.java, Direkt3.html (applets)
• Direkt3bjava, Direkt3bhtml
• Frame3.java (en applikation i Swing)
Swing och 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.
3
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.
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.
5
Vad består... (forts)
• Användaren kan tex flytta omkring fönster på skärmen—påverkar ej applikationen.
• 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).
Design av ett GUI: Två problem
• Presentera information från programmet
• Ta emot information från användaren (musrörelser, klickningar och tangenttryckningar)
[Idag fokuserar vi på det första problemet]
7
Vad gäller för de olika byggstenarna (komponenterna) i ett GUI?
(tex: fönster, knappar, skjutreglage, ...)
• De ritas på skärmen (och har färg, form, ...)
• tar emot knapptryckningar..
• vissa hanteras som självständiga objekt på skärmen, andra ingår som komponenter i nåt större
Komponenter i AWT
Component
Button TextComponent Checkbox Container Label List Scrollbar Canvas
TextArea TextField Panel Window ScrollPane
Dialog Frame Applet
9
Komponenter i Swing
Container(AWT)
JComponent
... JSlider JScrollBar JScrollPane JTextComponent AbstractButton JPanel JLabel
JEditorPane JTextArea JTextField
JToggleButton JButton
JRadioButton JCheckBox
Komponenter i Swing (forts)
Applet(AWT)
JApplet Frame(AWT) Dialog(AWT)
Window(AWT)
JWindow JFrame JDialog
11
Om AWT och Swing
• AWT och Swing har ungefär samma struktur
• Swing ingår som en del av AWTs klasshierarki: alla klasser i Swing ärver från AWT-klassen Container
• Klasser i Swing har ett namn som börjar på ’J’
De grundläggande byggstenarna
• Komponenter (arvingar till Component)
• Behållare (arvingar till Container)
• Layouthanterare (implementerar gränssnittet LayoutManager)
• Händelser (arvingar till den abstrakta basklassen AWTEvent)
• Lyssnare (gränssnitt som man implementerar för att ta hand om händelser)
13
De grundläggande byggstenarna (forts)
Alla komponenter utom fönster (Window och Dialog) måste placeras i en behållare för att synas.
Man placeras en komponent genom att anropa någon av behållarens add-metoder. Vilken metod man bör
använda styrs av vilken layout-hanterare man valt.
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), ...,
15
Klassen Component: koordinater
Varje komponent har sitt eget koordinatsystem med(0,0) i övre högra hörn. Positionen anges i behållarens
koordinatsystem.
Notera att positionen normalt inte anges på detta sätt, man överlåter ansvaret på en layout-hanterare.
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
17
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å.
Definierar en metod add för att lägga till komponenter (och en metod remove för att ta bort).
Om AWT och Swing (forts)
• 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 AWT.
Förutom funktionaliteten från Component och
Container hanterar JComponent ramar, tips (en slags hjälpfunktioner), hantering av tangenttryckningar.
19
Om AWT och Swing (forts)
• 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.
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
21
En närmare titt på Container, JComponent och JWindow
Förenklad klassstruktur
Container
JComponent JFrame,JWindow JDialog, JInternalFrame
[Diverse verktyg och skrivytor]
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
23
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.
Container: Utseende
En mängd metoder, tex
background(Color), getBackground() setForeground(Color), getForeground() setFont(Font), getFont()
setBorder(Border), getBorder()
25
Container: Layout
I stället för att placera ut komponenterna i ett fönster med (tex) koordinater, använder man speciella layouthanterare som placerar ut komponenterna enligt någon strategi.
På så sätt får man (förhoppningsvis) en design som fungerar bra på olika typer av skärmar, om användaren ändrar storlek etc.
BorderLayout — Arbetar med max 5 komponenter.
Dessa ska placeras på någon av positionerna North, West, Center, East, South
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
27
Layout (forts)
GridLayout — Placerar ut komponenterna enligt ett koordinatsystem.
Program: VisaGridLayout.java
FlowLayout — Komponenterna placeras från vänster till höger, uppifrån och ner
Program: VisaFlowLayout.java
BoxLayout — Radar upp komponenterna horisontellt eller vertikalt
CardLayout — Komponenterna placeras ’på varandra’ så att en komponent i taget blir synlig.
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
29
Sammanfattning
• Java har två system för att skriva GUI—AWT och Swing
• I ett program med ett GUI styr användaren vad som ska hända härnäst
• Vi har fokuserat på att presentera information för användaren—mycket pyssel men egentligen inte så komplicerat