Ö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()
• 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