论坛首页 Java企业应用论坛

两种不同的实现mvc模式(1)

浏览 2714 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-07-07  
 view接口,供所有view 实现
java 代码
 
  1. public interface View {  
  2.     public void refreshContactView(String firstName, String lastName);  
  3. }  
model  java 代码 
  1. import java.util.ArrayList;  
  2. import java.util.Iterator;  
  3.   
  4. public class TextModel {  
  5.     private String firstName;  
  6.     private String lastName;  
  7.     
  8.     private ArrayList contactViews = new ArrayList();//用来存不同的视图的容器  
  9.       
  10.     public TextModel(){  
  11.         this(null);  
  12.     }  
  13.     public TextModel(View view){  
  14.         firstName = "";  
  15.         lastName = "";  
  16.           
  17.         if (view != null){  
  18.             contactViews.add(view);  
  19.         }  
  20.     }  
  21.     public void addContactView(View view){  
  22.         if (!contactViews.contains(view)){  
  23.             contactViews.add(view);  
  24.         }  
  25.     }  
  26.       
  27.     public void removeContactView(View view){  
  28.         contactViews.remove(view);  
  29.     }  
  30.   
  31.     public void updateModel(String newFirstName, String newLastName){  
  32.           
  33.             if (!isEmptyString(newFirstName)){  
  34.                 setFirstName(newFirstName);  
  35.             }  
  36.             if (!isEmptyString(newLastName)){  
  37.                 setLastName(newLastName);  
  38.             }  
  39.               
  40.             updateView();  
  41.         }  
  42.     private void updateView(){  
  43.         Iterator notifyViews = contactViews.iterator();  
  44.         while (notifyViews.hasNext()){  
  45.             ((View)notifyViews.next()).refreshContactView(firstName, lastName);  
  46.         }  
  47.     }  
  48.       
  49.     public String getFirstName(){ return firstName; }  
  50.     public String getLastName(){ return lastName; }  
  51.      
  52.       
  53.     public void setFirstName(String newFirstName){ firstName = newFirstName; }  
  54.     public void setLastName(String newLastName){ lastName = newLastName; }  
  55.      
  56.     private boolean isEmptyString(String input){  
  57.         return ((input == null) || input.equals(""));  
  58.     }  
  59. }  
用来修改的视图 构造里传入model ,同时启动控制器类
java 代码
 
  1. public class EditView extends JPanel implements View{  
  2.   
  3.     private static final String UPDATE_BUTTON = "Update";  
  4.   
  5.     private static final String EXIT_BUTTON = "Exit";  
  6.   
  7.     private static final String CONTACT_FIRST_NAME = "First Name  ";  
  8.   
  9.     private static final String CONTACT_LAST_NAME = "Last Name  ";  
  10.   
  11.     private static final int FNAME_COL_WIDTH = 25;  
  12.   
  13.     private static final int LNAME_COL_WIDTH = 40;  
  14.   
  15.     private EditController controller;  
  16.   
  17.     private JLabel firstNameLabel, lastNameLabel;  
  18.   
  19.     private JTextField firstName, lastName;  
  20.   
  21.     private JButton update, exit;  
  22.   
  23.     public EditView(TextModel model) {  
  24.           
  25.         controller = new EditController(model,this);  
  26.         createGui();  
  27.     }  
  28.   
  29.     public void createGui() {  
  30.         update = new JButton(UPDATE_BUTTON);  
  31.         exit = new JButton(EXIT_BUTTON);  
  32.   
  33.         firstNameLabel = new JLabel(CONTACT_FIRST_NAME);  
  34.         lastNameLabel = new JLabel(CONTACT_LAST_NAME);  
  35.   
  36.         firstName = new JTextField(FNAME_COL_WIDTH);  
  37.         lastName = new JTextField(LNAME_COL_WIDTH);  
  38.   
  39.         JPanel editPanel = new JPanel();  
  40.         editPanel.setLayout(new BoxLayout(editPanel, BoxLayout.X_AXIS));  
  41.   
  42.         JPanel labelPanel = new JPanel();  
  43.         labelPanel.setLayout(new GridLayout(01));  
  44.   
  45.         labelPanel.add(firstNameLabel);  
  46.         labelPanel.add(lastNameLabel);  
  47.   
  48.         editPanel.add(labelPanel);  
  49.   
  50.         JPanel fieldPanel = new JPanel();  
  51.         fieldPanel.setLayout(new GridLayout(01));  
  52.   
  53.         fieldPanel.add(firstName);  
  54.         fieldPanel.add(lastName);  
  55.   
  56.         editPanel.add(fieldPanel);  
  57.   
  58.         JPanel controlPanel = new JPanel();  
  59.         controlPanel.add(update);  
  60.         controlPanel.add(exit);  
  61.         update.addActionListener(controller);  
  62.         exit.addActionListener(new Handler());  
  63.   
  64.         setLayout(new BorderLayout());  
  65.         add(editPanel, BorderLayout.CENTER);  
  66.         add(controlPanel, BorderLayout.SOUTH);  
  67.     }  
  68.   
  69.     public Object getUpdateRef() {  
  70.         return update;  
  71.     }  
  72.   
  73.     public String getFirstName() {  
  74.         return firstName.getText();  
  75.     }  
  76.   
  77.     public String getLastName() {  
  78.         return lastName.getText();  
  79.     }  
  80.   
  81.     public void refreshContactView(String newFirstName, String newLastName) {  
  82.         // TODO 自动生成方法存根  
  83.         firstName.setText(newFirstName);  
  84.         lastName.setText(newLastName);  
  85.   
  86.     }  
  87.   
  88.     private class Handler implements ActionListener {  
  89.         public void actionPerformed(ActionEvent event) {  
  90.             System.exit(0);  
  91.         }  
  92.     }  
  93.   
  94. }  
控制类,把model类和View类注册进来,通过这个类去改变model,model改变时
 * 调用自身的update方法,更新view
java 代码
 
  1. import java.awt.event.ActionEvent;  
  2. import java.awt.event.ActionListener;  
  3.   
  4. public class EditController implements ActionListener {  
  5.     private TextModel model;  
  6.     private EditView view;  
  7.     
  8.     public EditController(TextModel model2, EditView view2) {  
  9.         // TODO 自动生成构造函数存根  
  10.         view = view2;  
  11.         model = model2;  
  12.     }  
  13.   
  14.     public void actionPerformed(ActionEvent evt){  
  15.         Object source = evt.getSource();  
  16.         if (source == view.getUpdateRef()){  
  17.             updateModel();  
  18.         }  
  19.     }  
  20.     private void updateModel(){  
  21.         String firstName = null;  
  22.         String lastName = null;  
  23.         if (view.getFirstName()!=null){  
  24.             firstName = view.getFirstName();  
  25.         }  
  26.         if (view.getLastName()!=null){  
  27.             lastName = view.getLastName();  
  28.         }  
  29.         model.updateModel( firstName, lastName);  
  30.     }  
  31. }  
用来显示model数据视图
java 代码
 
  1. import java.awt.BorderLayout;  
  2. import javax.swing.JPanel;  
  3. import javax.swing.JScrollPane;  
  4. import javax.swing.JTextArea;  
  5.   
  6. class DisplayView extends JPanel implements View {  
  7.     private JTextArea display;  
  8.   
  9.     public DisplayView() {  
  10.         createGui();  
  11.     }  
  12.   
  13.     public void createGui() {  
  14.         setLayout(new BorderLayout());  
  15.         display = new JTextArea(1040);  
  16.         display.setEditable(false);  
  17.         JScrollPane scrollDisplay = new JScrollPane(display);  
  18.         this.add(scrollDisplay, BorderLayout.CENTER);  
  19.     }  
  20.   
  21.     public void refreshContactView(String newFirstName, String newLastName) {  
  22.         display.setText("UPDATED CONTACT:\nNEW VALUES:\n" + "\tName: "  
  23.                 + newFirstName + " " + newLastName + "\n");  
  24.     }  
  25.   
  26. }  
整个mvc用到model controller view 都是联系起来的
 * model-->view
 * view--->model
 * controller把它们联系起来
java 代码
 
  1. import java.awt.event.WindowAdapter;  
  2. import java.awt.event.WindowEvent;  
  3. import java.io.Serializable;  
  4. import javax.swing.JFrame;  
  5. import javax.swing.JPanel;  
  6.   
  7. public class RunMVCPattern {  
  8.       
  9.     public static void main(String [] arguments){     
  10.          
  11.         TextModel model = new TextModel();  
  12.           
  13.         EditView editorView = new EditView(model);///增加视图  
  14.         model.addContactView(editorView);  
  15.         createGui(editorView, "Contact Edit Window");  
  16.           
  17.         System.out.println("Creating DisplayView");  
  18.         DisplayView displayView = new DisplayView();  
  19.         model.addContactView(displayView);  
  20.         createGui(displayView, " Display Window");  
  21.     }  
  22.       
  23.     private static void createGui(JPanel contents, String title){  
  24.         JFrame applicationFrame = new JFrame(title);  
  25.         applicationFrame.getContentPane().add(contents);  
  26.         applicationFrame.pack();//自动适应大小  
  27.         applicationFrame.setVisible(true);  
  28.     }  
  29. }  
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics