Swing och AWT Objektorienterad programmering med Java Swing Sven-Olof Nyström Uppsala Universitet March 14, 2006 Skansholm: Kapitel 6 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. 1 3 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 (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. 2 4
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. 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] 5 7 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). 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 6 8
Komponenter i AWT Component Button TextComponent Checkbox Container Label List Scrollbar Canvas Komponenter i Swing (forts) Window(AWT) Frame(AWT) Dialog(AWT) Applet(AWT) TextArea TextField Panel Window ScrollPane JWindow JFrame JDialog JApplet Applet Dialog Frame 9 11 Komponenter i Swing Container(AWT) Om AWT och Swing JComponent... JSlider JScrollBar JScrollPane JTextComponent AbstractButton JPanel JLabel 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 JEditorPane JTextArea JTextField JToggleButton JButton Klasser i Swing har ett namn som börjar på J JRadioButton JCheckBox 10 12
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) 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),..., 13 15 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: 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. 14 16
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 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. 17 19 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) 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. 18 20
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 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 21 23 En närmare titt på Container, JComponent och JWindow Förenklad klassstruktur Container Container (forts) För att placera en komponent b i ett fönster w (tex JFrame), skriv JComponent JFrame,JWindow JDialog, JInternalFrame w.getcontentpane().add(b) getcontentpane plockar fram en särskild arbetsyta. [Diverse verktyg och skrivytor] 22 24
Container: Utseende En mängd metoder, tex background(color), getbackground() setforeground(color), getforeground() setfont(font), getfont() setborder(border), getborder() 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 25 27 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 (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. 26 28
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 30