Projekt 2 XL Objektorienterad modellering och diskreta strukturer Inför nästa projekt Lennart Andersson Reviderad 2011 10 24 2011 OMD 2011 F15-1 Schema designmöten OMD 2011 F15-2 Observer-mönstret 2 och 9 nov 10-12 2 och 9 nov 13-15 3 och 10 nov 8-10 3 och 10 nov 10-12 4 och 11 nov 13-15 Anmälan senast den 24 oktober. Inlämning senast 24 timmar före mötet. public interface Observer { public void update(observable observable, Object object); public abstract class Observable { public void addobserver(observer observer) protected void notifyobservers() OMD 2011 F15-3 OMD 2011 F15-4
Listener-mönstret Gui-modellering public interface ActionListener { public void actionperfomed(actionevent actionevent); public class AbstractButton extends JComponent { public void addactionlistener( ActionListener actionlistener) protected void fireactionperformed( ActionEvent actionevent) Den oerfarne gör allt i en stor klass. Den agile gör lite i många klasser med beaktande av principen om enkelt ansvar. Paket OMD 2011 F15-5 OMD 2011 F15-6 Paketet expr xl avvecklingspaket expr aritmetiska uttryck modifieras ej gui användargränssnittet modifieras menu menyer modifieras Expr Num Add... AddressExpr ExprParser OMD 2011 F15-7 OMD 2011 F15-8
Paketet gui Varför inte javax.swing.jtable? Gui med main GuiList CurrentView StatusArea Editor RowNumberPanel SheetView SlotView JTable tillhandahåller mycket som skulle göra projektet lättare, men döljer mycket av det som projektet vill lära ut javadoc omfattar 68+ sidor OMD 2011 F15-9 Paketet menu menyerna OMD 2011 F15-10 Paketet xl Address Environment Adjustment NumberAdjustment XLException XLBufferedReader XLPrintStream En del av dessa klasser bör flyttas. OMD 2011 F15-11 OMD 2011 F15-12
XL Gui BorderLayout JFrame ger ett eget fönster på skärmen. import javax.swing.jframe; import java.awt.borderlayout; public class Gui extends JFrame { public Gui(int count) { super("untitled-" + count); setlayout(new BorderLayout()); // omissions pack(); setvisible(true); OMD 2011 F15-13 Structure OMD 2011 F15-14 Structure JMenuBar BorderLayout BorderLayout North Center West GridLayout(1,11) Center Gridlayout(8,11) South OMD 2011 F15-15 OMD 2011 F15-16
statusarea Editor JTextField JTextField används för textinmatning. public class CurrentView extends JLabel { public CurrentView() { super("a1"); setbackground(color.white); setopaque(true); public class Editor extends JTextField implements ActionListener { public Editor() { setbackground(color.white); addactionlistener(this); public void actionperformed(actionevent event) { // activated by Return key // contents returned by gettext() OMD 2011 F15-17 WindowMenu OMD 2011 F15-18 JMenuItem class WindowMenuItem extends JMenuItem implements ActionListener { private Gui gui; public WindowMenuItem(Gui gui) { super(gui.gettitle()); this.gui = gui; addactionlistener(this); public void actionperformed(actionevent event) { gui.tofront(); OMD 2011 F15-19 OMD 2011 F15-20
JMenu public class WindowMenu extends JMenu implements Observer { private GuiList guilist; public WindowMenu(GuiList guilist) { super("window"); this.guilist = guilist; guilist.addobserver(this); update(null, null); public void update(observable observable, Object object) { removeall(); for (Gui gui : guilist) { add(new WindowMenuItem(gui)); OMD 2011 F15-21 MouseListener Några swing-komponenter kan ha en ActionListener, t ex: JButton, JMenuItem, JTextField. Alla komponenter kan ha en MouseListener. Den läggs till med public void addmouselistener(mouselistener listener); public interface MouseListener { void mouseclicked(mouseevent event); void mouseentered(mouseevent event); void mouseexited(mouseevent event); void mousepressed(mouseevent event); void mousereleased(mouseevent event); GuiList public class GuiList extends Observable implements Iterable<Gui> { private List<Gui> list = new ArrayList<Gui>(); public void add(gui gui) { list.add(gui); setchanged(); notifyobservers(); public Iterator<Gui> iterator() { return list.iterator(); //omissions OMD 2011 F15-22 MouseAdapter I regel vill man bara reagera på en av händelserna. Då är det bekvämt med public abstract class MouseAdapter { public void mouseclicked(mouseevent event){ public void mouseentered(mouseevent event){ public void mouseexited(mouseevent event){ public void mousepressed(mouseevent event){ public void mousereleased(mouseevent event){ OMD 2011 F15-23 OMD 2011 F15-24
MouseListenerLabel public class MouseListenerLabel extends JLabel { private class ClickListener extends MouseAdapter { public void mouseclicked(mouseevent event) { setbackground(color.yellow); public MouseListenerLabel() { setbackground(color.white); addmouselistener(new ClickListener()); OMD 2011 F15-25