Ö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