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å måndag) 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" 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 Fler prylar JOptionPane" JLabel" Flera knappar" ImageIcon" Menyer, toolbars, etc" JScrollPane" Popupmenyer" Listor 133 134 JOptionPane Enkelt att göra olika meddelandedialoger " Finns färdiga" Kan modifiera och göra egna JOptionPane.showMessageDialog( null, "Kolla", "Vad kul", JOptionPane.ERROR_MESSAGE ); x = JOptionPane.showConfirmDialog( null, "Hello world") ; s = JOptionPane.showInputDialog( null, "Skriv nåt" ); JOptionPane.showMessageDialog( null, "Du skrev: " + s, "Meddelande", JOptionPane.INFORMATION_MESSAGE ); 135 136 JLabel Enkel text" eller en bild" eller båda private JLabel info =new JLabel() info.settext( Användare: +username) Knappar Push buttons" Check buttons" Radio buttons" Grupper av radio buttons 137 138
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) Menyer Menyrad" Menyer" Menyval 139 140 JMenuBar menubar = new JMenuBar( ); setjmenubar( menubar ); JMenu file = new JMenu( "Arkiv" ); JMenu edit = new JMenu( "Redigera" ); class OpenAction extends AbstractAction OpenAction( String name ) super( name, new ImageIcon( "bilder/middle.gif" ) ); menubar.add( file ); menubar.add( edit ); JMenuItem fileclose = new JMenuItem( "Stäng" ); public void actionperformed( ActionEvent ae ) statusline.settext( "Inte öppnas nåt nu inte" ); fileclose.addactionlistener( new ActionListener() public void actionperformed( ActionEvent ae ) // Stäng fönstret AddressBook.this.dispose(); ); file.add( fileclose ); 141 file.add( new OpenAction( "Öppna" ) ); 142 Toolsbars Ligger längst upp" Flyter omkring 143 144
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" ); 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 145 146 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); Listor JList" Listor av godtyckliga objekt JComboBox patternlist = new JComboBox(patternExamples); patternlist.seteditable(true); patternlist.addactionlistener(this); 147 148 JScrollPane Implementerar scrollning till en component JScrollPane sp = new JScrollPane( jl ); add( sp ); 149