您的位置:首页 > 编程语言 > Java开发

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mvc