java学习之MVC模型
2015-06-11 11:07
495 查看
mvc
模型--视图--控件(Model-View--Controller)结构是一种开发组件的方法,它将数据存储和数据处理从数据可视化表示中分离开来。存储和处理数据的组件称为模型Model,它包含组件的实际内容。表示数据的组件称为视图 view,它处理组件所有必要行为,它完成所有组件的显示。控件(controller)通常是一种获取数据的组件。
简单来说:控件获取数据,模型存储数据,视图显示数据。
下面给出一个例子演示用MVC方法进行组件开发的方法:
首先创建一个名为CircleModel存储圆的属性(半径radius,是否填充filled和颜色color)
CircleView根据圆的属性绘制一个圆形。CircleController可以通过图形用户界面输入圆的属性。创建一个Demo applet,其上有
两个按钮,显示控件和显示视图。单击控件按钮是可以显示控件对话框输入圆的一些属性值,单击view按钮在一个单独的框架中显示视图。具体代码如下:
CilcleModel.java
package com.mvc.test;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
public class CirCleModel {
private double radius;
private boolean filled;
private Color color;
private ArrayList<ActionListener> actionlistenerlist;
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
processEvent(new ActionEvent(this,ActionEvent.ACTION_PERFORMED,"radius"));
}
public boolean isFilled() {
return filled;
}
public void setFilled(boolean filled) {
this.filled = filled;
processEvent(new ActionEvent(this,ActionEvent.ACTION_PERFORMED,"filled"));
}
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
processEvent(new ActionEvent(this,ActionEvent.ACTION_PERFORMED,"color"));
}
public synchronized void addActionListener(ActionListener l){
if(actionlistenerlist==null)
actionlistenerlist=new ArrayList<ActionListener>();
actionlistenerlist.add(l);
}
public synchronized void removeActionListener(ActionListener l){
if(actionlistenerlist!=null&&actionlistenerlist.contains(l))
actionlistenerlist.remove(l);
}
private void processEvent(ActionEvent e) {
// TODO Auto-generated method stub
ArrayList list;
synchronized(this){
if(actionlistenerlist==null) return ;
list=(ArrayList)actionlistenerlist.clone();
}
for(int i=0;i<list.size();i++){
ActionListener listener=(ActionListener)list.get(i);
listener.actionPerformed(e);
}
}
}
该模型中定义了监听器,在视图中实现监听器,视图将模型作为其属性包含在内,视图设置模型后,视图就被注册到模型CircleView.java代码如下:
<span style="font-size:14px;">package com.mvc.test;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class CircleView extends JPanel implements ActionListener{
private CirCleModel model;
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
repaint();
}
public CirCleModel getModel() {
return model;
}
public void setModel(CirCleModel newmodel) {
model = newmodel;
if(model!=null){
model.addActionListener(this);
}
repaint();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
if(model==null) return ;
g.setColor(model.getColor());
int xCenter=getWidth()/2;
int yCenter=getHeight()/2;
int radius=(int)model.getRadius();
if(model.isFilled()){
g.fillOval(xCenter-radius, yCenter-radius, radius*2, radius*2);
}
else{
g.drawOval(xCenter-radius, yCenter-radius, radius*2, radius*2);
}
}
}
</span>
CircleController.java
<span style="font-size:14px;">package com.mvc.test;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class CircleController extends JPanel{
private CirCleModel model;
private JTextField jtfradius=new JTextField();
private JComboBox jcbofilled=new JComboBox(new Boolean[]{
new Boolean(false),new Boolean(true)
});
public CircleController(){
JPanel panel1=new JPanel();
panel1.setLayout(new GridLayout(2,1));
panel1.add(new JLabel("Radius"));
panel1.add(new JLabel("Filled"));
JPanel panel2=new JPanel();
panel2.setLayout(new GridLayout(2,1));
panel2.add(jtfradius);
panel2.add(jcbofilled);
setLayout(new BorderLayout());
add(panel1,BorderLayout.WEST);
add(panel2,BorderLayout.CENTER);
jtfradius.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(model==null) return;
model.setRadius(new Double(jtfradius.getText()).doubleValue());
}
});
jcbofilled.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(model==null) return;
model.setFilled(((Boolean)jcbofilled.getSelectedItem()).booleanValue());
}
});
}
public CirCleModel getModel() {
return model;
}
public void setModel(CirCleModel newmodel) {
model = newmodel;
}
}
</span>
MVCDemo.java 一个applet实现上述功能
package com.mvc.demo;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MVCDemo extends JApplet {
private JButton jbtController = new JButton("Show Controller");
private JButton jbtView = new JButton("Show View");
private CircleModel model = new CircleModel();
public MVCDemo() {
setLayout(new FlowLayout());
add(jbtController);
add(jbtView);
jbtController.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFrame frame = new JFrame("Controller");
CircleController controller = new CircleController();
System.out.println(model.radius);
System.out.println(model.isFilled());
controller.setModel(model);
System.out.println(model.radius);
System.out.println(model.isFilled());
frame.add(controller);
frame.setSize(200, 200);
frame.setLocation(200, 200);
frame.setVisible(true);
}
});
jbtView.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFrame frame = new JFrame("View");
CircleView view = new CircleView();
System.out.println(model.radius);
System.out.println(model.isFilled());
view.setModel(model);
System.out.println(model.radius);
System.out.println(model.isFilled());
frame.add(view);
frame.setSize(500, 200);
frame.setLocation(200, 200);
frame.setVisible(true);
}
});
}
public static void main(String[] args) {
MVCDemo applet = new MVCDemo();
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("MVCDemo");
frame.getContentPane().add(applet, BorderLayout.CENTER);
frame.setSize(400, 320);
frame.setVisible(true);
}
}
相关文章推荐
- 分享微信开发Html5轻游戏中的几个坑
- Zend的MVC机制使用分析(二)
- ASP.NET MVC 4 捆绑和缩小实例介绍
- ASP.NET MVC中的AJAX应用
- 如何在MVC应用程序中使用Jquery
- ASP.NET MVC小结之基础篇(二)
- ASP.NET小结之MVC, MVP, MVVM比较以及区别(一)
- Asp.net实现MVC处理文件的上传下载功能实例教程
- ASP.NET MVC小结之基础篇(一)
- Flex中最好的MVC框架Mate框架
- ASP.NET MVC学习笔记
- 关于php mvc开发模式的感想
- php打造属于自己的MVC框架
- 使用ASP.NET MVC 4 Async Action+jQuery实现消息通知机制的实现代码
- mvc下,3种窗口弹出设置的方法
- ASP.NET MVC运行出现Uncaught TypeError: Cannot set property __MVC_FormValidation of null的解决方法
- PHP发明人谈MVC和网站设计架构 貌似他不支持php用mvc
- JSP开发中在spring mvc项目中实现登录账号单浏览器登录
- .NET MVC中ViewData,ViewBag和TempData的区别浅析
- ASP.NET MVC中的视图生成实例分析