Presentation is loading. Please wait.

Presentation is loading. Please wait.

עקרונות תכנות מונחה עצמים תרגול 8: MVC

Similar presentations


Presentation on theme: "עקרונות תכנות מונחה עצמים תרגול 8: MVC"— Presentation transcript:

1 עקרונות תכנות מונחה עצמים תרגול 8: MVC

2 Outline MVC Using the default models Example- File Browser

3 MVC (Model View Controller)
“Model–view–controller (MVC) is a software architectural pattern  for implementing user interfaces. It divides a given software application into three interconnected parts, so as to separate internal representations of information from the ways that information is presented to or accepted from the user.” -Wikipedia

4 MVC - Model A model stores data that is altered by the controller and displayed in the view. Whenever there is a change to the data it is updated by the controller

5 MVC - View A view requests information from the model that it uses to generate an output representation to the user

6 MVC - Controller A controller can send commands to the model to update the model's state (e.g., editing a document). It can also send commands to its associated view to change the view's presentation of the model (e.g., by scrolling through a document)

7 Outline MVC Using the default models Example- File Browser

8 Using the Default Models
Swing supplies default, mutable models for all widgets: List Tree (nodes) Table Spinner Slider

9 getModel public boolean isPressed() { return getModel().isPressed(); }
JButton +isPressed: boolean +getModel: ButtonModel ButtonModel +isPressed: boolean public boolean isPressed() { return getModel().isPressed(); }

10 Example 1 DefaultListModel

11 Default List Model Example
Add and remove elements from a list using the default model: public class SimpleList extends JFrame { private JList _list; private DefaultListModel _model; ... }

12 Constructor with Default List Model
public SimpleList() { super( "ListDemo" ); setModel(new DefaultListModel()); setList(new JList(_model)); getList().setPreferredSize(new Dimension(100, 300)); getContentPane().add(getList(), BorderLayout.CENTER); JToolBar tBar = new JToolBar(); JButton tAdd = new JButton("+"); // calls add() tBar.add(tAdd); JButton tRem = new JButton("-"); // calls rem() tBar.add(tRem); getContentPane().add(tBar, BorderLayout.NORTH); ... }

13 Adding and Removing with the Default Model
private void add() { String tVal = JOptionPane.showInputDialog( this, "Add new value"); if (tVal != null) { getModel().add(getModel().getSize(), tVal); } private void rem() { int[] is = getList().getSelectedIndices(); Arrays.sort(is); for (int i = is.length - 1; i >= 0; i--) { getModel().remove(is[i]); }}

14 Outline MVC Using the default models Example- File Browser

15 A Simple File Broswer The file browser shows: Directories tree
List of files in the selected directory Content of the selected file

16 Example 2 FileBrowser

17 Model View Controller File Browser Tree Model List Model
Tree Cell Render List Cell Render The File Browser View Controller

18 File Browser Tree Model List Model Tree Cell Render List Cell Render
The File Browser

19 A Model for the Tree View
Tree model Get Root Get Children count per node Get Childe for index Check if a node is leaf Directories tree model Root = Top directory Children = sub-directories in the directory Leaf = A directory without sub-directory

20 The Directories Tree Model
public class DirTreeModel implements TreeModel { private File _dir; public DirTreeModel(File dir) { setDir(dir); } private static FileFilter _FILTER = new FileFilter() { public boolean accept(File file) { return file.isDirectory(); }; private File[] list(File file) { return file.listFiles(_FILTER); Anonymous class

21 Tree Model Inferface Methods
public Object getRoot() { return getDir(); } public Object getChild(Object parent, int index) { File[] tChildren = list((File)parent); return tChildren[index]; public int getChildCount(Object parent) { return list((File)parent).length;

22 Tree Model Interface Methods (cont’d)
public boolean isLeaf(Object node) { return getChildCount(node) == 0; } public int getIndexOfChild(Object parent, Object child) { List<File> tFiles = Arrays.asList(list((File)parent)); return tFiles.indexOf((File)child);

23 File Browser Tree Model List Model Tree Cell Render List Cell Render
The File Browser

24 TreeCellRenderer Defines the requirements for an object that displays a tree node. Implemented by DefaultTreeCellRenderer getTreeCellRendererComponent(..) gets the components properties and configures the renderer Add it to your VIEW

25 Rendering a Directories Tree Cell
public class DirTreeCellRender extends DefaultTreeCellRender{ public Component GetTreeCellRenderComponent( JTree tree, Object Value, boolean cell, boolean expended, boolean leaf, int row, boolean hasFocus) { super.getCellRenderComponent(…); File tRoot = (File) getModel().getRoot(); File tFile = (File)value; setText(tRoot.equals(value)?tFile.getAbsolutePath(): tFile.getName()); setIcon( expanded? openIcon : closeIcon ); return this; }}

26 File Browser Tree Model List Model Tree Cell Render List Cell Render
The File Browser

27 List Model Our List Model is mutable (changes when we change directory) This means we need to implement the following interface methods: addListDataListener(ListDataListener l) removeListDataListener(ListDataListener l) Otherwise, the list view won’t update when the model is changed

28 Files List Model public class FilesListModel implements ListModel {
private File _dir; private List<File> _files; private Collection<ListDataListener> _listeners; private static FileFilter _FILTER = new FileFilter() { public boolean accept(File f) { return f.isFile(); } }; public FilesListModel() { setListeners(new LinkedList<ListDataListener>()); setFiles(Collections.EMPTY_LIST); 18 / 31

29 Files List Model Interface Methods
public int getSize() { return getFiles().size(); } public Object getElementAt( int index) { return getFiles().get(index); public void addListDataListener(ListDataListener l) { getListeners().add(l); public void removeListDataListener(ListDataListener l) { getListeners().remove(l);

30 Setting the Directory public File getDir() { return _dir; }
public void setDir(File dir) { _dir = dir; int tOldSize = getSize(); File[] tFiles = dir.listFiles(_FILTER); setFiles(Arrays.asList(tFiles)); int tMax = Math.max(tOldSize, getSize()); ListDataEvent tEvt = new ListDataEvent(this,LDE.CONTENTS_CHANGED, 0,tMax); for (ListDataListener tListener : getListeners()) { tListener.contentsChanged(tEvt); { 19 / 31

31 File Browser Tree Model List Model Tree Cell Render List Cell Render
The File Browser

32 Rendering a Files List Cell
public class FilesListCellRenderer extends DefaultListCellRenderer{ private static Color _ALT = new Color(220, 220, 220); public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus( { super.getListCellRendererComponent(...); File f = (File) value; setText(f.getName()); if (!isSelected && index % 2 == 0){ setBackground(_ALT); return this; }

33 File Browser Tree Model List Model Tree Cell Render List Cell Render
The File Browser

34 Putting It Together public class FileBrowser extends JFrame
implements TreeSelectionListener, ListSelectionListener { private JTree _tree; private JTextArea _content; private JList _files; ... }

35 File Broswer Constructor
public FileBrowser(File file) { super(file.getAbsolutePath()); // Tree setTree(new JTree(new DirTreeModel(file))); getTree().setCellRenderer(new DirTreeCellRenderer()); getTree().addTreeSelectionListener(this); // File list setFiles(new JList(new FilesListModel())); getFiles().setCellRenderer(new FilesListCellRenderer()); getFiles().setSelectionMode(LSM.SINGLE_SELECTION); getFiles().addListSelectionListener(this); // Text area setContent(new JTextArea(10, 30)); ... } View View Model Model View with default model

36 Listening to Tree Events
public void valueChanged(TreeSelectionEvent e) { File tDir = (File) e.getPath().getLastPathComponent(); ((FilesListModel)getFiles().getModel()).setDir(tDir); }

37 Listening to List Events
public void valueChanged(ListSelectionEvent e) { // If the value is still adjusting we get two events, Un-select and select if (e.getValueIsAdjusting()) return; File tFile = (File) getFiles().getSelectedValue(); getContent().setText(""); try { BufferedReader tIn = new BufferedReader(new FileReader(tFile)); String tLine; while ((tLine = tIn.readLine()) != null) { getContent().append(tLine + "\n"); } tIn.close(); getContent().setCaretPosition(0); } … }


Download ppt "עקרונות תכנות מונחה עצמים תרגול 8: MVC"

Similar presentations


Ads by Google