MER Java Foundation Classes (JFC) Swing Swing Många klasser Vettigt att lära sig dem utantill - Tror inte det -... men det kan vara bra att ha en liten överblick över vad som finns - Idag (och med fortsättning på torsdag) kommer vi ta en snabbgenomgång kring ett antal av klasserna och se på ett par av designmönstrena som används. 115 116 Hur lära sig? Principerna - Model - view - controller - Observer - observed - Adapter Öva, dvs skriv kod - Ofta och mycket Kolla på exempel Vad är farorna Personlig erfarenhet - Dålig dokumentation i vissa fall Sätter sällan in saker i sitt sammanhang - Logik på fel ställe Lätt att man placerar logiken på det ställe där det för stunden känns enklast istället för att tänka igenom var saker borde finnas 117 118 Exempel på några av komponenterna LayoutManagers BorderLayout - Har vi tittat på FlowLayout - Har vi tittat på GridLayout CardLayout BoxLayout etc Designmönster (Strategy) 119 120
GridLayout GridLayout Demo import javax.swing.jbutton; import javax.swing.jframe; public class GridDemo public static void main(string[] args) JFrame frame=new JFrame(); frame.setlayout(new GridLayout(3,2)); frame.add(new JButton("Ett")); frame.add(new JButton("Två")); frame.add(new JButton("Tre")); frame.add(new JButton("Fyra")); frame.add(new JButton("Fem")); frame.add(new JButton("Sex")); frame.setvisible(true); 121 122 Card layout 123 124 CardLayoutDemo TabbedPane Komponent som kan användas som ett substitut för att direkt använda sig av CardLayout Tabbar läggs till med addtab eller inserttab Se TabbedPaneDemo 125 126
BoxLayout Med denna LayoutManager så kan man lägga ut komponenter i boxar. Boxarna kan vara antingen horisontella eller vertikala med en komponent per rad/ kolumn. Alternativ till att använda BoxLayout direkt är att använda Box klassen som är en container som har använder BoxLayout och innehåller ett antal extra metoder för att tex lägga till mellanrum På bilden till höger används ett antal olika containrar med BoxLayout för att åstadkomma layouten Fler LayoutManagers Det finns ett flertal andra färdiga. Undersök de klasser som implementerar någon av interfacen LayoutManager eller LayoutManager2. Rätt sällan man behöver skriva egna. De flesta gränssnitt går att konstruera genom en kombination av de inbyggda. 127 128 Layoutmanagers och designpatterns Layoutmanagers använder sig av ett designpatern som kallas för Strategy. Löser problemet att vi vill kunna ha möjlighet att byta ut algoritmer Konstruera egna Vyklasser Man behöver själv rita upp utseendet - Händelsestyrt - styr inte själv - paintcomponent(graphics g) Omdefinieras för att rita om komponentens utseende - repaint (flera olika överlagrade finns) Anropas för att meddela att komponenten behöver ritas om pga någon tillståndsförändring 129 130 Graphics Exempel på metoder i Graphics - drawstring - drawline - drawrect - drawpolygon - fillrect - fillpolygon - setcolor - setfont 131 132
Java 2D Förbättrad grafik så att det blir lite snyggare Anti-aliasing Fyll med mönster, gradienter, etc Bättre typsnittshantering Mer objektorienterat figurer, linjer, transformeringar JOptionPane Enkelt att göra olika meddelandedialoger Finns färdiga Kan modifiera och göra egna Graphics objektet som skickas till tex paintcomponent är egentligen ett Graphics2D-objekt - Vi kan typkonvertera till denna typ och sedan använda den nya funktionaliteten 133 134 JOptionPane.showMessageDialog( null, "Kolla", "Vad kul", JOptionPane.ERROR_MESSAGE ); x = JOptionPane.showConfirmDialog( null, "Hello world") ; s = JOptionPane.showInputDialog( null, "Skriv nåt" ); JLabel Enkel text eller en bild eller båda private JLabel info =new JLabel() info.settext( Användare: +username) JOptionPane.showMessageDialog( null, "Du skrev: " + s, "Meddelande", JOptionPane.INFORMATION_MESSAGE ); 135 136 Knappar Push buttons Check buttons Radio buttons Grupper av radio buttons ImageIcon Enkelt sätt att få symboler på olika ställen Klarar JPEG, GIF och PNG bilder Inte en egen komponent, men ett antal andra komponenter kan visa upp ImageIcons (tex JLabel, Menyer etc) 137 138
Menyer Menyrad Menyer Menyval JMenuBar menubar = new JMenuBar( ); setjmenubar( menubar ); JMenu file = new JMenu( "Arkiv" ); JMenu edit = new JMenu( "Redigera" ); menubar.add( file ); menubar.add( edit ); JMenuItem fileclose = new JMenuItem( "Stäng" ); 139 fileclose.addactionlistener( new ActionListener() public void actionperformed( ActionEvent ae ) // Stäng fönstret AddressBook.this.dispose(); ); file.add( fileclose ); 140 class OpenAction extends AbstractAction OpenAction( String name ) super( name, new ImageIcon( "bilder/middle.gif" ) ); Toolsbars Ligger längst upp public void actionperformed( ActionEvent ae ) statusline.settext( "Inte öppnas nåt nu inte!!" ); Flyter omkring file.add( new OpenAction( "Öppna" ) ); 141 142 JToolBar tb = new JToolBar( ); tb.add( new HiAction() ); tb.add( new PlainAction( ) ); class PlainAction extends AbstractAction PlainAction( ) super( "plain", new ImageIcon( "bilder/rabbit.png" ) ); public void actionperformed( ActionEvent ae ) statusline.settext( "Jag vill ha en morot" ); 143 144
Popup-menyer JPopupMenu För att visa dessa för en komponent så sätt en MouseListener på componenten och identifiera om mustryckningen är en något som ska visa upp menyn via metoden ispopuptrigger i MouseEvent JComboBox String[] petstrings = "Bird", "Cat", "Dog", "Rabbit", "Pig" ; JComboBox petlist = new JComboBox(petStrings); petlist.setselectedindex(4); petlist.addactionlistener(this); public void actionperformed(actionevent e) JComboBox cb = (JComboBox)e.getSource(); String petname = (String)cb.getSelectedItem(); updatelabel(petname); JComboBox patternlist = new JComboBox(patternExamples); patternlist.seteditable(true); patternlist.addactionlistener(this); 145 146 Listor JList Listor av godtyckliga objekt JScrollPane Implementerar scrollning till EN komponent JScrollPane sp = new JScrollPane( jl ); add( sp ); 147 148