Grafiska Användargränssnitt i Java Översikt Java SWING API Paket

Översikt
Grafiska Användargränssnitt i
Java
Fredrik Bengtsson
[email protected]
• Java SWING API
• Komponenter
– JPanel, JButton, mfl...
• Layouthanterare
– FlowLayout, BoxLayout, GridBagLayout, mfl...
• Menyer
• Lyssnare
• Modeller
– DataModel, SelectionModel, mfl...
• Rita om skärmen
Java SWING API
• ”Ersätter” tidigare AWT
– Egentligen en utökning av AWT
• Finns i paketet javax.swing
• Massor av klasser och ännu fler metoder!
– kan verka överväldigande
– behöver absolut inte använda alla i början
• Portabelt
– ser likadant ut på alla plattformar
Paket att importera
• För grafiken
– import java.awt.*;
– import java.awt.event.*;
– import javax.swing.*;
• Om ni vill ha
– import java.util.Observer;
– import java.util.Observable;
• om man vill
Struktur
• Fönster
– JFrame, JDialog, JApplet
• JFrame
– ”vanligt” fönster
– plats för menyrad (menu pane)
– plats för resten (content pane)
• JDialog
– dialogrutor
– finns flera färdiga
• JFileChooser för att öppna/spara filer
Komponenter
• Exempel på komponenter:
– alla ärver JComponent
• JPanel
– tom komponent
– placera andra komponenter i denna
• JLabel
– enkelt textfält
• JButton
– knapp
• En komponent ”placeras” i en annan med add()
• Exempel...(nästa slide)
1
Hur ser då komponenter ut?
Label
Panel
JFrame
• Använd getContentPane()
– placera komponenter i content pane
– getContentPane().add(<komponent>)
• Kan behöva anropa pack()
– ser till att komponenterna ligger ”rätt”
Text field/area
Button
JTable
• Komponent som representerar en tabell
Menyer
• JMenuBar
– själva menyraden
– sätt med
• JMenu
– en meny
• JMenuItem
– ett alternativ i en meny
– en ”lyssnare” aktiveras när man väljer att alternativ
• Exempel (nästa slide...)
Lyssnare
• Kopplas till en komponent
• ”lyssnar” på händelse
–
–
–
–
–
musklick
tangenttryckning
tryck på knapp
menyval
osv...
• Implementerar ett gränssnitt
– t.ex. ActionListener, MouseListener, KeyListener
– gränssnitten finns i java.awt.event
• Vid händelse
– metod exekveras i lyssnaren
• Exempel... (nästa slide)
Layouthanterare
• Bestämmer hur komponenter placeras i en
Container
• Alla objekt som är en Container har
layouthanterare
– FlowLayout
– BoxLayout
– GridLayout
• enkelt rutnät
– GridBagLayout
• kraftfullast
• rutnät
• gruppera komponenter i JPanel
– annars tenderar det att krångla
☺
2
Exempel på layouter
Layouthanterare
• Default för content pane på JFrame
FlowLayout
– BorderLayout
• Byt layouthanterare med setLayout()
BoxLayout
GridBagLayout
Modeller
• Används i flera SWING-klasser
• Separerar data från presentation
– SWING-klasserna innehåller inte alltid datat de
presenterar
• Exempel:
– En JList innehåller inte data ur listan
• använder ett objekt (DataModel) för att hämta data
– DataModel
• ett gränssnitt som man implementerar själv
– anpassat till datat
• Innehåller funktion för att hämta data
– JList använder dessa
Exempel på detta
Omritning av skärmen
• paintComponent() ska rita upp allt
– anropas automatiskt (av operativsystemet)
– Anropar paintComponent på alla underliggande
komponenter
• t.ex. knappar i en JPanel
• Om man vill rita nåt eget?
– skugga paintComponent()
• anropa alltid super.paintComponent()
• Om man vill rita om själv då?
– anropa repaint()
• java kör paintComponent() åt dig.
– kör inte paintComponent() själv
Mitt enkla exempel
• Mitt exempel på webben innehåller:
–
–
–
–
–
–
JFrame
JPanel
JButton
menyer
lyssnare
Observer/Observable
• Fler exempel på suns webb
– http://java.sun.com/docs/books/tutorial/uiswing/
3
Observer
Observable
+update(observable:Observable,_message:Object): void
Nästan gång:
+setChanged(): void
+notifyObservers(message:Object): void
Main
+main(argv[]:String): void
• JTable
JPanel
– komponent som representerar en tabell
GUIMain
+update(observable:Observable,_message:Object): void
DrawPanel
+paintComponent(graphics:Graphics): void
DataModel
+loadFile(file:File): void
+getCrossState(): boolean
+getCrossColor(): int
+setCrossState(state:boolean): void
+setCrossColor(color:int): void
GUIActionListener
+actionPerformed(actionEvent:ActionEvent): void
4