Swing Många klasser MER Java Foundation Classes (JFC) Swing 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. 122 123 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 124 125 Exempel på några av komponenterna LayoutManagers BorderLayout - Har vi tittat på FlowLayout - Har vi tittat på GridLayout CardLayout GridBagLayout BoxLayout etc 126 127
GridLayout GridLayout Demo public class GridDemo extends JFrame public GridDemo() this.setlayout(new GridLayout(3,2)); add(new JButton("Ett")); add(new JButton("Två")); add(new JButton("Tre")); add(new JButton("Fyra")); add(new JButton("Fem")); add(new JButton("Sex")); 128 public static void main(string[] args) GridDemo g=new GridDemo(); g.setvisible(true); 129 Card layout 130 131 public class CardDemo extends JFrame private JPanel buttonpanel; private JPanel cardpanel; private CardLayout cl; public CardDemo() setlayout(new BorderLayout()); cl=new CardLayout(); cardpanel=new JPanel(cl); cardpanel.add("one",new JButton("Ett")); cardpanel.add("two",new JButton("Två")); cardpanel.add("three",new JButton("Tre")); buttonpanel=new JPanel(); JButton first=new JButton("First"); first.addactionlistener(new ActionListener() public void actionperformed(actionevent e) cl.first(cardpanel); ); buttonpanel.add(first); 132 133
Tabbed pane public class TabbedDemo extends JFrame public TabbedDemo( ) super( Tabbed Demo ); JTabbedPane tp = new JTabbedPane( ); setcontentpane( tp ); JPanel jp = new JPanel( ); jp.add( new JButton( Ett ) ); tp.addtab( One, jp ); jp = new JPanel( ); jp.add( new JButton( Två ) ); tp.addtab( Two, jp ); jp = new JPanel( ); jp.add( new JButton( Tre ) ); tp.addtab( Three, jp ); pack(); setvisible( true ); 134 135 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 136 137 GridBagLayout GridBagLayout was contributed to Javasoft by a programmer who wanted to support the Java effort. It was intended as a proof that the AWT offered enough features for programmers to write their own layout managers. It wasn't designed with human factors and ease of use in mind. If it bothers you (it bothers me) then just don't use it. Create your GUI on several panels and use the other layout managers as appropriate to get the exact effect you want. JavaSoft's AWT team project leader has said that eventually another layout manager will be added that does similar things to GBL, but is more intuitive. Bottom line: nobody has to waste any effort on GBL, there are better alternatives available. Peter van der Linden 138 139
140 141 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. 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 De flesta gränssnitt går att konstruera genom en kombination av de inbyggda. 142 143 Rita i Vyklasser Händelsestyrt - styr inte själv paint update paintcomponent repaint, repaint(x) Graphics drawstring drawline drawrect drawpolygon fillrect 144 fillpolygon setcolor setfont 145
public class DrawingPanel extends JPanel public DrawingPanel( ) setbackground( Color.white ); setborder( BorderFactory.createTitledBorder( "Exempel" ) ); public void paintcomponent( Graphics g ) super.paintcomponent( g ); g.drawstring( "Bluttan", 100, 60 ); Font cfont Font newfont = g.getfont(); = new Font( cfont.getname(), cfont.getstyle(), cfont.getsize() + 20 ); 146 g.setfont( newfont ); g.drawstring( "Blättan", 200, 80 ); g.drawline( 50, 50, 100, 200 ); g.setcolor( Color.blue ); g.drawroundrect( 150, 300, 100, 125, 15, 15 ); g.setcolor( Color.red ); g.filloval( 400, 200, 50, 180 ); 147 Java 2D Förbättrad grafik så att det blir lite snyggare Anti-aliasing Fyll med mönster, gradienter, etc Bättre typsnittshantering figurer, linjer, transformeringar 148 149 public void paintcomponent( Graphics g ) super.paintcomponent( g ); Graphics2D g2 = (Graphics2D) g; g2.setrenderinghint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON ); g2.setstroke( new BasicStroke( 4.0f ) ); g2.drawstring( "Bluttan", 100, 60 ); Font cfont = g2.getfont(); Font newfont = new Font( cfont.getname(), cfont.getstyle(), cfont.getsize() + 20 ); g2.setfont( newfont ); g2.drawstring( "Blättan", 200, 80 ); Line2D line = new Line2D.Double( 50.0, 50.0, 100.0, 200.0 ); g2.draw( line ); g2.setpaint( Color.blue ); RoundRectangle2D rect = new RoundRectangle2D.Double( 150.0, 300.0, 100.0, 125.0, 15.0, 15.0 ); g2.draw( rect ); 150 g2.setpaint( Color.red ); Ellipse2D oval = new Ellipse2D.Double( 400.0, 200.0, 50.0, 180.0 ); g2.fill( oval ); 151
Fler prylar JOptionPane JLabel Flera knappar ImageIcon Menyer, toolbars, etc Adaptor klasser JScrollPane JSlider, JSpinner Listor, popupmenyer och träd JOptionPane Enkelt att göra olika meddelandedialoger Finns färdiga Kan modifiera och göra egna 152 153 JOptionPane.showMessageDialog( null, "Kolla", "Vad kul", JOptionPane.ERROR_MESSAGE ); JLabel x = JOptionPane.showConfirmDialog( null, "Hello world") ; s = JOptionPane.showInputDialog( null, "Skriv nåt" ); Enkel text Eller en bild Eller båda JOptionPane.showMessageDialog( null, "Du skrev: " + s, "Meddelande", JOptionPane.INFORMATION_MESSAGE ); 154 155 private JLabel statusline = new JLabel( ); Knappar Push buttons Check buttons Radio buttons statusline.settext( "Användare: " + username + " Lösenord: " + password ); Grupper av radio buttons 156 157
JRadioButton catbutton = new JRadioButton(catString); catbutton.setmnemonic(keyevent.vk_c); catbutton.setactioncommand(catstring); ButtonGroup group = new ButtonGroup(); group.add(birdbutton); group.add(catbutton); group.add(dogbutton); group.add(rabbitbutton); group.add(pigbutton); 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) catbutton.addactionlistener(this); public void actionperformed(actionevent e) picture.seticon(createimageicon("images/" + e.getactioncommand() + ".gif")); 158 159 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" ); 160 fileclose.addactionlistener( new ActionListener() public void actionperformed( ActionEvent ae ) // Stäng fönstret AddressBook.this.dispose(); ); file.add( fileclose ); 161 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" ) ); 162 163
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" ); 164 165 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); 166 167 Listor JList jl = new JList( new Object[] "Första", new Person( "Kalle", "Anka" ), "Tredje", "Fjärde", "Femte", "Etthundratusen kronor", new Person( "Knatte", "Anka" ), new Person( "Fnatte", "Anka" ), new Person( "Tjatte", "Anka" ), new Person( "Kajsa", "Anka" ), ); 168 169
JScrollPane Implementerar själva scrollningen JScrollPane sp = new JScrollPane( jl ); add( sp ); 170 171 Träd DefaultMutableTreeNode root = new DefaultMutableTreeNode( "Ankeborg" ); JTree tree = new JTree( root ); JScrollPane sp = new JScrollPane( tree ); DefaultMutableTreeNode duck = new DefaultMutableTreeNode( "Anka" ); duck.add( new DefaultMutableTreeNode( "Kalle" ) ); duck.add( new DefaultMutableTreeNode( "Knatte" ) ); duck.add( new DefaultMutableTreeNode( "Tjatte" ) ); duck.add( new DefaultMutableTreeNode( "Fnatte" ) ); duck.add( new DefaultMutableTreeNode( "Kajsa" ) ); duck.add( new DefaultMutableTreeNode( "Arne" ) ); duck.add( new DefaultMutableTreeNode( "Sven" ) ); duck.add( new DefaultMutableTreeNode( "Bettan" ) ); duck.add( new DefaultMutableTreeNode( "Sonja" ) ); root.add( duck ); DefaultMutableTreeNode vonduck = new DefaultMutableTreeNode( "von Anka" ); vonduck.add( new DefaultMutableTreeNode( "Joakim" ) ); root.add( vonduck ); 172 173 JTable och dess model-objekt Klasser för modeller - Exempel på designmönstret adapter TabelModel Interface som kan implementeras för att tillhandahålla data till en JTable AbstractTabelModel Abstrakt klass som innehåller det som behövs för att innehållet ska visas i en JTable-vy. Implementerar TableModel DefaultTabelModel Subklass till AbstractTableModel som använder en Vector av Vector av Object för att lagra värdena. Går också att använda om man har en 2-dim array av värden. Designmöntret - Adapter Konverterar klassens gränssnitt. Låter klasser fungera tillsammans trots att deras gränssnitt inte matchar Motsvarande model-klasser finns även för en del av de andra vy-klasserna som JList och JTree 174 175 Client Target request() Adaptor request() adaptee Adaptee specificrequest() adaptee.specificrequest()