使用模型-视图-控件结构来开发GUI程序。

下面的程序演示了MVC模式开发的java程序。

其中CircleModel为模型,包含了圆的半径,是否填充,等属性。

CircleView为视图,显示这个圆。

CircleController为控制器,控制圆的大小,以及是否被填充。

模型:

 package circleMVC;

 import java.awt.Color;
import java.awt.event.*;
import java.util.*; public class CircleModel {
//圆半径
private double radius = 20; //是否填充
private boolean filled; //颜色
private java.awt.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 java.awt.Color getColor() {
return color;
} public void setColor(java.awt.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){
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);
}
}
}

视图:

 package circleMVC;

 import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CircleView extends JPanel implements ActionListener{
private CircleModel model; public void actionPerformed(ActionEvent actionEvent){
repaint();
} //设置一个model
public void setModel(CircleModel newModel) {
model = newModel; if(model != null){
//给model增加啊监听器
model.addActionListener(this);
} repaint();
} public CircleModel getModel(){
return model;
} 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, 2 * radius, 2 * radius);
}else{
g.drawOval(xCenter - radius, yCenter - radius, 2 * radius, 2 * radius);
}
}
}

控制器

 package circleMVC;

 import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CircleController extends JPanel{
private CircleModel model;
private JTextField jtfRadius = new JTextField();
@SuppressWarnings("unchecked")
private JComboBox jcboFilled = new JComboBox(new Boolean[]{
new Boolean(false), new Boolean(true)
});
private JRadioButton jrbRed, jrbGreen, jrbBlue; //创建一个新的CircleController
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); JPanel panel3 = new JPanel();
panel3.setLayout(new GridLayout(1, 3));
panel3.add(jrbRed = new JRadioButton("Red"));
panel3.add(jrbGreen = new JRadioButton("Green"));
panel3.add(jrbBlue = new JRadioButton("Blue")); setLayout(new BorderLayout());
add(panel1, BorderLayout.WEST);
add(panel2, BorderLayout.CENTER);
add(panel3, BorderLayout.SOUTH); //将三个单选框组成单选按钮
ButtonGroup group = new ButtonGroup();
group.add(jrbRed);
group.add(jrbGreen);
group.add(jrbBlue); jtfRadius.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if(model == null) return ;//还没有model
model.setRadius(new Double(jtfRadius.getText()).doubleValue());
}
}); jcboFilled.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(model == null) return;
model.setFilled( ((Boolean)jcboFilled.getSelectedItem()).booleanValue());
}
}); //单选按钮监听
jrbRed.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(model == null) return;
model.setColor(Color.RED);
}
}); jrbGreen.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(model == null) return;
model.setColor(Color.GREEN);
}
}); jrbBlue.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(model == null) return;
model.setColor(Color.BLUE);
}
});
} public void setModel(CircleModel newModel){
model = newModel;
} public CircleModel getModel() {
return model;
}
}

MVCDemo:

 package circleMVC;

 import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MVCDemo extends JApplet {
private JButton jbtController = new JButton("Show Contuoller");
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() {
@Override
public void actionPerformed(ActionEvent e) { JFrame frame = new JFrame("Controller");
CircleController controller = new CircleController();
controller.setModel(model);
frame.add(controller);
frame.setSize(240, 100);
frame.setLocation(200, 200);
frame.setVisible(true);
}
}); jbtView.addActionListener(new ActionListener() { @Override
public void actionPerformed(ActionEvent e) {
JFrame frame = new JFrame("view");
CircleView view = new CircleView();
view.setModel(model);
frame.add(view);
frame.setSize(200, 200);
frame.setLocation(200, 200);
frame.setVisible(true);
}
});
} }

运行效果:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgkAAAF/CAIAAABMk83uAAAAA3NCSVQICAjb4U/gAAAgAElEQVR4Xu2dCZxdVZ3nb+2VfWHNVpUFbbBdoJsETCpVCYtN245Oj0oDISASQXuYtluZGRYj2mH7jNo6tmPbmgAmMNAI44zD1pKESiUgOCqtDoMtkKoKe8hWSSW1vWX+951XJ6fOOffcc++777173/29Tz6Ve//n//+f//me5X/PvW+pO+2005zgr3w+H9wIFiDgEqirqysTCPOwZKUtLc0nn3RCc3NTNps165cpSLgFgRIJ1Dl1DY0No6Njb+/dR39Fb+bJZS6VomqYPXt2oEAxnQLhgrIXgUDD1MuJKDePTF46c+b01kmtbmKwcQodEIgfARq6uVyusaHRcfJDQ8NSgOaZZS4VXZH3AC/z9AvgCKqpJ0BjyX6Y+tIyj0yxtLWlOZ/LOX6ZgTbGQbc3lTHxRQGFlBCgUd3a0srGtjiVzDPLXCqis80N5rmXks5AM6MloA7rcP7Ng1Mqratv8NIneTaXzWboiqyO1NzDbL6hob6hgc7198EqYxIOC6xqmwBtHerqPYel14glJpbpwTY31DZltK5WCejSQI4eeajtzefyY5nMtGlTpk2b2thYnBeZTObI4aNHjhxpbGqsr6+XrCpjooYKCQiMEyjuf9XlXpUEhWaVG3QTLGhF0AcBPYESB3GgwemlTKt8NpebN+/UlpYWMUpKEq2trdOmT33rrb10j1dMD5Ux0SODFAQUAoHmkY2y/7Nor+mkxAYBCIQnYNgCh3YqDV12OmP6NGXf4O4Y5s49RUoMvF6WIQYGDtOdpnHbypiEbjoM00Eg7wwMHBHnjjSPDNPKUMTY+ewbqpUYqlVvOgaUTyt9B42PfahimwsZyXFUg4TeszRj5nSeGMRI+HFra8uMGTOOHBmkZw8UhmSibbHB5Mjg4OjwiGjV3NoybepUyUTrFkIQUCdCiDnLpo/B0JQbSp97pXvAOKg8gdC9ZhhnNq0IkR4MbqVWCKfyW5TobtKM6dNZ8KT25ptvnXjSiS3NzSOjo/ve2Td37hxWNGPG9EOHBujRNFUqmhhi8DIZHRlppldLE7MdHRkjSd002tA4oonBM4pAoEBAHszSJCplTnnmhhALRAgTdHAtEVAHQNBsUcpQDk2yob6ePgrHgqeAKTG8s/edWbNmHjx46OSTTuRNIB22aaCKRBNDvQYTSgytrZO47ejYKDsWTQyeUQQC5Sagzw3qJPeKw17TywPkNUxAHB6WeSKS9BBkWOYbm5rE2FpbWmbNnkU7hhNPPKGltZX3Duk0NTXS3SR6O6tocmD/gcGjx8ROnDpl8uwT3I+Uepm4Dy2ojL8v1j0ongommjdT1fBQQdNKIWCYNYYic42a3GA5ryzVzNWjND0E2IARV2GvtvuO5qBjT9RXvu2ljt6iRG9AokWfxTM6OnrowCFKDIcODjQ1NdN3bDA56YyNZuob6smDaEJpgGUCtTleJqoml4gmBjUUgQARUAazS8V3+ojoDLNSzg02s85GBz0HAloChrEoDVmbLKKtwk8o36IdG8vQv/rCx4govL173znp5JMoJVBieOedd+bNm8siGRsby+Wy9Q2ummhiqM5gMjoy6uSLOwPKRtyJaGLwjCIQKBCgARvl9wuIVCe8h9V30fdVsO+wCF3ZVwrN0glEuGT7uvJVCNocGnUzpk9V3dLzg6nTprJpNn36NLp3RDr01lU6pgt5dnzgwKHh4RGWQqhe0YQU1BeZe5nQo2zKB2NjxX/0AVf6iie6l6WaBG0g9NNGYODwIB/P6gGjweVecLQKx/cNvou1r4JYcSBlr4ghjyEB357VjjNtQ9harC1iQl8Fgy0v8g2YVv939u2fPnNGo3u/aMJVGGsL/aXL+f37DzQ2um9gpZdkooZhNplOb0kqvCtJfKkmqltIQMCGQCQTR/4aAK+KzROMSqWXlx/Ia56APBS090THKZjHVThWQX3Sk+CGxvo9/a/l8g5duYu5jY5JQg77+19j715lIVXGJFzzYQUCEoGgM6I4yOn3G3wtmQLdgZ02dUpLS6v4zQHoBhCwJ0D360dGRg4fGQz0pfPkX9qLmEesVCqe0vH8eadqdzb5PH23Xu6UU06ePXsm5QO6z+M+Fh7L7D9wYN87+9mdJWXKVcLEHi8000aAxvOrr73JJ4h0WSPS0I55rqAtrVuyZIkZKJtaU6dOmTVzRjPdh62vc5/lGS8GzQ5RmlIChQGYy+fp3T4HDw0MDh61H7ukKQ7fcLmBWc2fd4p2JrBBTV/fTRE20QOHpiZ6Qk2vunp6a5Ln20nd9yyV3ySlAwbN9iNQyA1vibODj21pkHuNeVaDtlR+n5IUDJtOtGOYNXN6c7P75u48fhPFr8NQbiBAb+yngUTDiR7GirsHGmnaAWpwFXkR5a46esTsXvnQs+IRSgj8AYNXXZUx8aodchAoHwFTbuBXZ7RpaGhspO8jK18c8JwSAu51diZDN23o27D37z8kttqcHsylXvTMOwwvK5J77hS8bSpj4l0/SkDgOIFw80Uk6JkbxEmFn8rCoIuWAI2uMv1kVehkEG0D4Q0EYkUgRKrQ5wZpguGnsmLVzTUQTOifrHIN+VdNhAKB5BEKG4ziSCCqwcz8SDNLkxt09eGnsuI4MhIeUxl/sirhZBA+CFSfgCY3SEHpUoWrUpnfvQpRS/WhIoKABAJteAMpq4H870eeUIVVlHx944+qWDuqTjSB69d98qyzzipTE+TcIGWC4ik9QJTrd3/3Sv0NRa5F3wBw6qknv/HGm42N/EsuK2MiB4rzmBKgQSW8N0la8UtMADFtskdYt/3HazxKIAYBTwIHDx6cNWuWZ3HJBbafi5YqUn8qiyvw7MJ+xIpuELMi+5/K0prQT2Xt37df/EcS8izVUjIQOKgoAelaxLJusgpnaOkfaiAQfwLijrMc02FCbpAqEE5p2zDhH//dK/b4gn4qi742jI7pLx0TVjqmF/2IVeGrj11b0YSVav96mbCfypo6bQr7R7+a5f5UllKLFCdO401gwgT0Hn7xn6eIEARqjYB8T8myffipLEtQUAMBEACB8hGgKyq6Qi6H/+O5IciuBD+VVY6+SKlPw+A2FAWFFWR4B/UNfRCIC4EIp4znvkGcS8qXJ+GnsuIyFJIbhzKo3KYEGtlsiJbpoim5YBE5CERCwDM3TPQuv00JP5UVCf10O6G1vVzb4XSDRetBIAIC/u9T0m7G6SuLDw8cZl92T8fz58+j9wvRFRz9pWP+U1kDA0foayxZmKKJ9ik0Ccmhlwn9MBZ9KebRo4PsHx2TRDWJAAlcVJyAdoyFiCIqPyGqhgkIxJxA0Nmh3zf4epF+90rc17Nj+oufyor5WIlneNhMxLNfEFXaCBQv6n2TgcSlMr97FaKWtPVfzbc36MiseSBoIAhUhoB+3yDVrX1sWOfU53KZl37/svpTWfTru/ynskTbyphUBhxqKZEAGxjYJZSIEeYgUCYCPrlh/KpNfhbNoqEbRw0NDe/sfeftt/fKP5XVwHYksmFlTMoEC24jJTBhbJQjSWDPEWl/wVnCCJQ4p3xygy+MyvzuVYhafCOHAgiAAAiAgBcBzfuUQl9thfhwXmVMvBoPeTwJhB6BFWxOz4YL6bWhx61SPA4dwtYbzhZfN2yd4Ol4qVQQuj4YgoCZgLtvSMJUNLcCpbVMoMStsYKGlnK2pvOSzvVPru9U9CouuODOX9x5gVrr7u9ffPHWCx78xS8Wu2Vbb7hh6wU6NdUQEhAogYDVPSUkjxIIw1RPIKpBxfyI76LW1ydLx/NBIVNsWLdl48a17bKO5Tm5etJSNYTa1u9/f/Gdv7imkBjodcGdd4ZwAhMQCErAKjcEdQp9EEgMgc6uTqenp7+v33FYbujfsm7dZjorvNqvEHOGuuMoKDExSzbisVTkOAbXrh/3xlHBobP4mgcfLGaDrVu3XrB48cVnn71bKmCa+AsCZSJglRsef2Lizc8yxQK3KSPwvve9r/ot7tnhPjNoXzi+aejv6e3a+GRhD+Gu85vXbWhnN5xoYadbUSxZTFjkbdtAuxPKOTzbFPxtXD9uTTeUfjF+7N5FOns3v8O0datTvKPkFtywWHvnyTYK6IGAHQGr3ECu9u/fb+cQWiBgReCee+6x0iuXkvsAmfmeuDdoX/vltcU62ZbCTR6dnU5/zw53a9HV6WaN9s6u9s18cxEoxPb2YhZqX1tIDD/XWNO24c7dZ1NKuKDw+OGCa8bvKC2+5poLjss1lhCBQFQEbHNDVPXBDwhIBKJ+1GwJuPi8ge0N1jnjt448dwSFu07O+Mpe+H/8xpNtjVdc0d6z+XhOsnsCvnjx+JMGy2qgBgKRENC8hzUSv3ACAokg0LnefYdS/46ewkLPb/s8WXiJb15id536+1lCGP8/UBtpp8D8Msc9G8S3S7nvP+LeCm9GYpsG2io4vEiQB6oZyiAQmAByQ2BkMIiKQFRvVSotHvfOkdO/eXPhowriq3+LKHNvI/Ekwm4wyQbu+YQUMtGD+26o4laDaR1/yEGG9L7UrfwDDjc4wttZL7jzwcXfZ0U37Ka7TZq3ueoigQwESiJguqcUj6lbUvNgnCACVbq55BQfK2ze0t+5dv3GK+hdSpvXXbhZAec+H+hzH05ryo4rt69df8UOvQfaomxZd+GFx98CtX7iu2bFp9ETa6fnD7+4RgkIAhAoJwFTbihnvfANAtUioHwcQRS4933Gn0UrASqWTGOi2ODBUKTUBQEIVJdAWe4pLVq0yLdVNjq+TiwVKlmXZUhQAwEQAIE4E2iM240jwzre29tLKLmCdMooM6GoxuSiW64T545BbCKBat1uQi+AQGoJVPSekrTue63X4vqurvUkIUOeGMSFXvKPHJDaYY2GgwAIlEggytzAl2wWE1uppQW69PWaueXOpXwg4VBLSw+gROIwBwEQAIH4E4gsN0iJgVrOLvC9EIj62qTCDLWLu6hvXutZDExHjdArNshjSMD35qdBgRcZdGLYZIQEAjYE2B1Xft/VcAPWUEQVsdnBv7ZSzg3lnjxsrRcXdHXJ5qVS/hAxsSJt5pBo8hRlziI2fQCdihEwD+KKhYGKQCC1BOTcEC0I8bKdeRZXajUrMB1xxVdXf9GPNovwJki2/BRJItpehjcQAIHaIxBNbvBa5UVeXEdNGBJW7YrPV3abJV6Kh59K2aL2uhMtAgEQAIFICJTl8w2+kbHVX00SNjlGdc5WfJt1n2rEpkEFCAkIgAAISASiyQ2GBddQFK4zVIdMosrD+YcVCIAACIBANPeUGEfDlTsvUnWYxLCyGxREb1xNqkKtEb0OAiAAAiBgJhBlbjCs77zIoEOBSqVeGwKzN60TMwWUgkAVCRw8ePDrG39UxQBQNQioBKLMDap3SEAABMwErl/3yVmzZt32H/E9q2ZOKK00AeSGShNHfSAgEsCOAeMhngSQG+LZL4gqRQQ6L/xIilqLpioEep585LNXXa6I/QXfu/tef6WwGsgNYcnBDgSiI7CsfVJ0zuApSQR+3j9E4TbU18UtaOSGuPUI4gEBEEgdgQTnhnvuuSd13YUGgwAIgEBFCCQ1N2Qymc9//vMVQYRKUkTg7rvvTlFr0VQQ8CbQ0IB7St50UAICIAAC6SSQ1H1DOnsLrQYBEACByhBAbqgMZ9QCAiAAAkkikKTcwH/kp9y/9pOkDkSsURNgv+HDf8nH8JM+hiIKikrNClEHDn8gECWBJOWGKNs97gsfAS0H1Qr7pO94qHCNqA4Eap5A2nMDdfBfXr225ru5hhv43U1barh1aBoIgAAnUOnPvjXF761aGA0gAAIgUF0C2Vy+ugGotVc8NzRG82tCaksgAQEQAIGEEkBucJoakBsSOnprPuyeDRdu6HE61z+5vtPxOraHIHqwtAphYukZanEngNxAuSF2H/+L+6hBfBETYEuw6JTlg4irgTsQsCeA3IB9g/1ogWZZCaj5gCRPlrVKo3OesejgQmfC9oXbUYRdO45vbkgubzX6t6xbt7mfGbRfsXHj2nZjpSiMCwHkhmh7YuuNy27c5lxwx8/vOD9ax8nwJjY/5Sgi6TB5nfVyalh/1S2JlxNF7uYq4abWhHJhle/ZoVhyAQuMKReO161zkB68ecWpJJs9/iz6ovNWGEJ7YvvThtIIiyr9LHosmwse/e67Lrt0Uy+3O3/Dz24/zz3LF3DmM9ncWHCnAS28YgjoxlXftv6DN213eCtCeGAmYvMriSJ0wLVgaFh/qYieVwhLc/H6veRmd15hdfnf37ODamzv6nT3Cu1rr+jcvKFnR0//WivjkoOEg5IIiPuGR7fu+rMLOrTuqKhiO4zK54bAb9XqXk+JYdGnttz/qUWEq/eetRspxxaSQZ7lmfFTLcxIhNu+0nFzt3P+V3bdtqrgr3v9zSVUGlXYop+ofEaCKxFO2K0bFqp6f8mrCYb1d2JRZ1f75vGbO17OIpb397nJqH/zugs3c88FGe4rRUy6DO6kFf8nP9350Q+tlOohYcUSA1Vd+dwQdN+wfftTFOeiBW25sSwdtK+5Z4NT3CiwBZEW7m3jEBdd8cP71i4snvXfs2bd3cXtRvtV920s5Banb9O6Kzf1L7x64w+vbne2b+j6Uo9z3vodt3Y6vVuuXLO5b4IH5qjnFkoMTudXN6wY36Cs+AqPwdHXUvQ8Hpf7P/PMaqRTFjarWgyDiqRTrypY8/NZNyrx2K3MLipWuxhkeo7t84HIxLD+sqL2drYSF/6PauNg1yvtC9udnv5w7bKrAVplI6Au+j9+oufPL+rkFdKpqlO2cFzHlX5H6VgmF/Afu1tCy+XyC7tu3j7BnBU5bVdueWzbrsc2fbrN6d18y8ZXCjqv3OUmBlb0vSsX9d+95uq7XnGrnr+qYyFliN2u2rZtPS6E7d3byGR3b5/jLFy9fL4U4bbubtJZvaJDE7lnLRmv2FbdsG1D4Xpg9Y0U87a//aAb7fgdoWLrJpz6VZHPKB78TMaJFWvXtMurj9zAU/1y19/Cg2LxRe95pRcr6u9nCWH8/6hpTailf8vmwgBmr3baq9DT6c1beEoq4fFH1HHDn5kArfvqv4ce28Gs6EAtLXeqqHhuoNtBwf6tuv5Lq8exPnXH+R0fPr/js/fsZk4Ke5DVl6xZ6J4uWLiAzvp6d7v+d+/oph3DohUdbtGcjtVtjrOn+6lX3KKF8+jE6evbne/ufsppX7W83dnZvX1sd687pdoWzlHCO37nSi4y1MIu5LWxCfd/xh1KVQinvlU47t2trOhzosmaq+jB1njbJ0YlN8e/a8zjOwWlhvWXFfXTHX7iwG4wBQTSecUV7uJO71O60H0zkvbVvnY9Kbk3jujF35LEVNvXbqTPZhTL3PIdXe5nNfBKAAHt0k/Cf3qkm/55lZa1YZW+p0TPjQO3Z8VXHn78K67Vzls+fns3/b9ny109l311+fizaLqpknGLi5fbhdPewuVb+9z5uQzdiZrfPp+s+nf3ZXNzHeecjlVOT3d/7/b+HmfB5Vdd7PQ9c+/2ng5nj+Ms7+hSIhTdutUIL0MtkpV4qjo0KFtWoba99/7PrLyfx1psu1q11KL4ntYVXvRlq14hUqmhiBkadLxsJbm7/rbT+4n4Tf3j93CoaH3fhRsm3O+39FpUc52vFU10b6tVlCbUobMIFgS0q0Eg5z2wfcNho5qPbcMgNxRRLVJppXNDqPcpjcNZfssDj3R96yNffdahi2W6yZ4bv75m71MST9vm0uZgT19/b26pe9BL635hT1DQXN51rtO95967X3MWfmJ526l7FtI2Ype7e1u1bDl7qiF2R+eyDueZXd1P78gtld87YKjFEJtURHUZlC2rUNu+6q8fueVcsR0aYmJxeo69lk9R7nVcoOTlwFSSHrxoaRgC5b5BFCKmSt9T8tocecu7v/mRrzzDb8b19b1GrVzRtdSVOIVryHyuWCqeti9dsZBW/Gd39pLn/p3dZDV/ReecombXshXOa3v6ChuLfHZ51zlO33NP9427lW/8Lf1Pt5zjOM/eedWP+opFz9zBQjLUYohNKiKf7ew216sF//33/ZCS33i7LKtQ29790H1u2wv/OEO1armx3h3haoYYYTABARDwJUD7hhD/fN2WolDpfYP4EQ+7uGmvtePbHz3vuPKCK++4vrPgp7gNy2Xz7juYJp7OuXjTdf3nf+f+T68p3FiZd8mm2y9u57WfvbzLeXoHbSDOdm07ly53nnvGWbacuVXj6vz3P94096+ufvi68x4uFnZdV6jUuxZDbJ3/9pKFzz3AGtV13Y+/vMxp/9j1Vz77Vz8U/LvVsHbZVTGhOjLZPP9vr/hase2O49ZSaKkUldpSSEAABKpAgC5wq1Crscq6xYsXiwr8fq548Pzzzxud2BbSb/v8xcUX22pDL34E/unBByP8bZ8zzzyTmuh1t1S9N0oSw/MGlZaozI9/9atfqZpVlNCk6LzwI8vaJ1UxBlRdRQI/7x/qefKRiy8O85NZDz74o3u/c5vXDOKTi7dOnVNiw6v8vCFbvDFexb5A1SBQNQKa3EaiwqtqMaHiUATM62xQlzHcN1T8nlL8tk5BexH6IOBLAGu9L6KkK3h1cbicEcNr5krnhozwlVJJHxyIHwREAl6LBSilioA4DOzzRCnvYS0T3krnBrzXpUwdCbfVIoCUUC3y8a+Xjw3fJBHDhbHyuSH4Z9/iPwQQYfoIICWkr8/Dt9g3SWDf4GTwvCH8AINlLAggK8SiG5IZBBs86jYCz6KdbY//JJl9iqhBwCWAxIBxUDoBGkVSesjG741qFb2nFOFb40vvHngAgUAEkBUC4YKymYC0gcC+wYwLpSAQUwLlTgz0AajwLY/fJWf4tpTJ0vt7GMtUob1btoHA8wZ7YtAEgbgQiDYxSN7oM2/0sdi4NBVx2BHw/MpfO3NZq65u+xP/WxZW+7yi95Sq3VjUDwKBCYRLDPZWX7z6E4FjgkGMCajPmW2CDWdFnuk7M2z8h9BBbggBDSZpIWC/xBORQMppIZi+dorDwH7FJyt75cpATUxuoK8kqwyRNNSSkjcF0GQrZb22tLVUS8O4QhslAnxs2Kz7kacHm0oNXZaY3EBt+MurJ/wmlqFVKDIQ+O6mLYZSFDECviu+rwJIggAnYJkkIk8PpXRBknJDU0PET4BKAQfbGiZgXvfNpUGxROstaO3QtyRQ4jU4r4V1t8FbfNJDonJDY6V/pc5y3ECtlgiYF2tzqcohqL7qAZI4EPDtR8Nyr8ZvTgDmUtVbmSSJyg0NyA1lGgY14raUBwzFB1qFzwp8cZ3mh1Z8VwcytNGJCeu/2/QQj+QLKXivVLnbq3a9OVswfS+dcqQHr7q8BmSycgPuKXn1I+ThCbCs8LlPX84X929svJeOxQyhznyxPnOpLrKdt/3JrT1O55f++eaVuuKyytgqee1Va3gtf7fpPjqu1QwRXXuD9RofFYZFuRw5IKrBk6zcgH1DVP0OP0UClBiu/8tPsRM+mb9YkHzju/ew9DBx6d9565/curNgMC4PvcSTg0p/pvnv7nr4C5+9otj48f/+piD5xvc2f+HTH5eK+OnO2y66jTW7KFp58xNVSGxe4XnJg7dXaajDWxryt/nMScIrPXjJvVoauTxJuSHSxm+9cdmN25wL7vj5HedH6tfaWdUDsI60JhQNt5umtLizYPm5y3hDn/7Zc/xYu3rn8yuLl/yFS8lbr2n/wfcvb1NAaW0LWpVOCWJorL1KsAYBWy7b137/H9cUG0mSHoNBrIqCt5fCH88Hhabfdu19rOmF5OCZ0Q37AwaEjQdVzSsNeMkNeFXnBmVzUZJyw1g2xG8/7L7rsks39XII52/42e3nsQ4u/M1kc2NmQuFLi1Wfd9tzGwpVuq/tN624eZuz6DP3/vdFbJyVM4DwoafEkjYNt/zNOmqsmBjodMUHz6H08OW/WffVb26UPrfsTm9xYV/Z2en09PT39zsOLZtUuue+a6/ZQmfuS1xN6VS9Iq0wZ7qIXv/5T3tVSkUb/utd6tZh523uhmHlzTwxkANaOtnNMKlNxSXVAMGjSGUjwfOK2iQP194JHld2rnR27uzvY/0rFLGA+ZZCOnUmNnPClYM2Q3ilAS85jyTCZCChTNJdmrFsPui/J2+ixLDoU1ue7d5F/+7/1CInO+6E5Rl+GtSzhf6ilasXEe7tW7dy5Se3biPJwtXnzc+e92U3pNtWBm+URdUmUKbJlL6yoyOZwWHN5YFWzmb1BEg7e9zr5/b2NiobTwy0qj3xxBPfX9vev+Waa+/bw/RpsaAllhcVnRSsKvai3EWNNfxj18QT4ynkPWdlZ4c2zGI72i7/x8fd102k1X/vNZQdmeQfL28jCNfc28+MvYsm+iEzp3/LreNm2pothKHaO969zP/OHvdGWhvr3/Eiv/9ZYhCGwWeuubc4DLgpuZfcqBKm4CX3i6LU8mTlhhxtHYL827r9KQK0aEEbs2pfc8+GFUUP+UJu2PaVjnNXFf9detcrx52/vOnScfm5V256pVjpKz+4kpQv/8HLrpOtX3YNb9rmHr9y1+V0PMEDmczrOq+dKnlqW0HHNWHxdHa1TzR3SyOp0QZOqUOmtuwHh8aODmfUNqnyiVO059Y/Kbxu7XGXgOIl9Z6dPbSOtneudO+8tK25nC6t+3f0FNbF/p4d7qXnyo4FdLKgo6BRjdex4Yzhny6iPf0TlrVdt/8pe92+67j2yrXjN5schyCQQds4hLUEYU/PzoIPQxHzNe6nrd2dOFLNuuB8ZYbGUpG3+c7bWCspn1OWE7dMZON26LipeyycumLdMKC9pUUykBzx8LzkXKEcu4dE3VPKBL2nxHpj+4au5Y6z+sZtG4T3hBQ7qu3KLd+7YpHTd9dnr75r8y0bl2/6NE3aPZvXfvaHvazIPb57zdW5gtr8VR0LN/X37X4lk5u7Y5t7wehs796W+2DX7omO1D0AACAASURBVN4+dzuwfH5uTBxvRX2m4zjMpKjGAshnMu5Nrchq5IMFBzYE8vljI/oFQpIrk7N4M8G9lUCbA4fdji7ceqAL3msuOv7R88IC11Zc52h/UQirsPbJV5KFEqUim2bY6tDtsKMjmk0St3fvl8lLWHGgjhesuPGxm/IfpsTgCsbvr7Fj5qa/z23Ynnuv/VP3zV7staePVsYFjqFIqkU6tW2gpFdCeztufvzmDrcd91177b3XXuvI6cErIpeJbhiwu1KFZonrOKlLy7oqYVV5yb0CKV2eqNyQlXdhfu1fdf2XVu+81d070NX7Hed33EGzcu3mv19Lt3rYvmH1JWsW0i0aZ8HCBTQM+np3Z/NznN4d3b2021jR4RbN6Vjd9sPePd1PvbJmYZuzcB7N7b6+vt35bPdTTvuq5U73zu7t1y8orAltC+fQDaIJMS28+PLV9936lKvTsfppMqF72ZdfVVBjARTucUk1rrlqxQ+/TMqhavRDgvJxAjTZ6G1I39j4wCc++ckf/Oinn/nkhzib7z/4z8dGsw899BB72ODOd8FKHIUrb755JT2spM3BZXTlTLcenJ17Vt5Mt1YmcqaFsVBE92fyK9yrj8J9muLyWrku+ZurPv7Nux/8+Mf1b0Z6+OGHSUGJpqOzw9m1a1fPLqdDapWiWhC00TzZtafjpsdkCMYiva8SpaHaW6zTTXd0uKDN7a5ibhMz1vFjWuwnxqkZBlI+IH0uURd9VcL8e8lLpORlnqR7SvTYNvC/FV95+PEd7r+bVjEEe7bc1eP6KXZttuhTPO0tTNz2ufML1c1vn09n/bv7CprndJCf3v7e7bt6nAUrr7p45UKnZ3tP7266VFre0aUJbwXlD/qG/u09WdfEcVadu4K1Qq2x9/7PrPzYh+jfl58upUY/SoxDyv+Ky/3QaIb+ffu+x+jff733UfrHJAyRlBhEbu7yke+gh5V0lXyve4elbWUnrSQ7t9xXvL2ez9Otidt2ul3d1uEW7enZVbio3uXedjG8Cp7L8nLyztBIRvuPirRVrrjxRkoKu27/LG8WJ0P64nHBfMEK94bZrnsFCLd/+HaCYCyS/ShutaH5C0O0d0K/7Nnj9pSb76QXE7nFFET/fVsK7+9l8SwYHwa8k3e573YaZ8Wbxj2SmeRdlahWckRRnydr35AL3/zltzzwSNe3PvLVZx26VKfbODnmq3BML/G0ba47i/v6e3NL3YNeNjjmMM3lXec63Xvuvfs1Z+Enlredumch7SN27SAPq5Ytp8cGaoCdyzqcZ3Z1f+NPu92yjq6lnjWu+utHbjlXdBCyRjWG2pGwqy2vmWPZTtG8sHVwv+L3vIs+6poXZum2f3Z/aIU2DaKmXOn4fHaTw86dbkJYcVnbZd97rI1Wws9+uHg/pXj5TLYLLv2HG/v+7I57eRGrTVkVLNsQVu2vr/p337r7f5D16g99hPt46qfujwtRkYfXjhsf/Yf//rnP3fe5P3M/I+f3arvsHx5tu+PP7uDaZO5mF3oZivy8hiwP1V6qa9ftH/7weJVta2681H1MRHmm8KJDutVw6Y1rej5338T+LFosKA4DflutuJVkQ0i7Y6Aiy2cG9pr2yLRVJyk3ZHNydvVr/I5vf7T7nJ/ccg7T29P3Gh2s6Fqay9MaXvCVp59pZeu5cNq+dMXCh/b0Pbuz988vXfjazm6ymr+ic05Rs2vZCufZp/scp2vu/Hx2ftc5TvdzdJ2/4krmVg1p6Youp5A96HXOii7eCqXG7ofuu2LppQsLimLkgWtkdaXzL41yeRGfCEItZR9wowzBh5f2VhJzQxuFmx5/nLt0vdEd+MduPF5Jx02PPioMVKE+WiMfjUGvsBzwzbsf5rHobiVJgbqr+mWa4D3a5CF2HeiLJKleSVO/hShgew1VTyzSIil0t7vU0lXBY0JwJB6/9SRmCHGhlxZ96VRsqKHIi4d29fdSZvJE5YbAzxuoQ2iRPe84ggVX3nF9J93iL14f0n4hy3JD8fKNnc65eNN1/ed/5/5Pr7nfNZ13yabbL24vWLmvs5d3OU/vcJZ3ne3adi5d7jz3jLNsOXN7vKrjR+d2LXN2/Nw971p6bj5b3FvINW6e/7dXfK1YI2le9+MvF/yHqlEXRTplvqmCY5G+MUJY0t3rRKamHnBzUT8RqC3yQSLaYRtkJdsrDgZxl8BiZRK+vosLvbToS6diUw1FYi22dHR6dYsXL5aqZKfiNHj++ed1thWV0ceU/uLiiytaZY1W9k8PPhiT3/Y588wziTGbKnwKqQe8H9RpJnURn3WiXBzJJP/lL3+pdqw4malUPJXMvUpVn14SqS4vNcjjTIAPRfsgRRN1kGtLmXNDXVR01llnkZrZoaigDVhbRaL2DcWHAtrWQQgCPgRoAmjXZfvEoM0ZXrVq69Iq22tqzSEsNwF16fTqMlWTx8ZMmAI/pgMu4bZcyGylU7GxUhiG2kMgSlZuEG7jhmgrTEBAISDNLvGUH7MD6VTxNGG3YZjAqqGXRIrNSw3yqAh4ra2+HSEu62IwqkPmSswHJCklPVB1ai2RAElSbqA3nkbSZjipbQI0VXwnMyMgqYmnUiZgp1q3BiciZ61tiI6Iyk+IqmvJRLuehmDLl3UJjiSXqmMVsYHK/5IHknNN8VgqCtoR2sb6OklSbgj+PiXf5kOh9gmwuae207Cm8yJ2IP7lfkRzgyupXklTjSqEpBw+Q4QRZxN1cSwdmrT6i82Xhpx4KkZCMbAi/pecMCHzJh5LRWbaanvN+trSZOWGEj7foG09hCkjQHPmj//4j9k0401XlwkmUeUGkyqCNMRZxahiVXUka2X5WsTD84pTldtISgw4SbkhE/jzDSXCgXnNEmBXal7NM5eSlTQzA63OgZS9IoQ8EIHImatLc6B4vMyljYI60tRavFypmkElScoN2x7/SdDmQb8mCbD5YD/hzWu9Wso829eizk8xNvs4a7KzarJRhj5lg0EdEpYceHoweDAUUS3mUikMg3JickNM3pJv2cFQqy4BGvFes5cXiTpshjATyVAsMjfKUKPZEKW1R4ANBsPKa26yl6Ek56de+lSLocgcQ2Jyg7kZKAWBEARo2ogLOp3mPD5DwyeYmgBUSYhIYFKTBPjYsFmgRR0yVE0kiaoQLcP6aN3BGwjEhIDlRPKdkFJz1AmpSmJCAGHEhwCt9ezFQqIxo76kaKVrjhDjmRyWMjixb4jP+EEkwQiwcR/isp0MuZV6wKeT1rNWWMoMZG3Wug2GA9qVIhBJd9s4oVFRX+9/+W7jSmXja4XcoEKDpEYIiDmAmiSesmPziswnD1MzK9sji8qPfY3QjJYA9aDvwupbIxsGXn7EsSfpGE4NRb7xqArIDSoTSJJEgK3ylhEblNm80i7czEqaeFSjVplHYi61DBhq8STg1bnqIPGN39dETEWG1d/XjxiJjTJyg2/fQSHBBNiyLs0KmmxsbmtLuTKf/74LgVbBZvolmCxCtyZgHgni0q+6lGxFZbFIrUKVqM7NEuQGMx+UJoCAusSLQaul4lLOppDX4s5TCHcoamqtIuRVbv8RhlobrkpfT7UceD96+Wcrvlep5JOUfR9CmF2ZS3l1yA3a3oQwYQTUBCA2QCxl85BKxZWXzxbfpV905TvH7Bd3e82EdUyiwrXsBa9+95KrDLSafGSq+kwijlJ+rLpSJdJc8PIvyZEbLEFBLe4EfKcEzT1x8pO+uhZI009SUPUlKL4KXhDNwXtZQR4rAlLvG/qUaaoKJBeFqgJvL9NUFVSJiMhcKsFEbojV6EIwFSXApoq6oHOJOJfEeSuZqB5KbEbkDkuMJ1XmgRZQAxntKBL1+YiSarQJQKujFRoiNBchN5j5oDRJBGhueK2qTK5VYDOKG2o9SELJxGtOal3ZAPVyaGMLnWoR8O01rYIq5DlD2xBRX9RU/UjmvgqSPnKDlj+ESSXAJoC0KIunpKBdsrWGjIKqr0q8NJPKEXEHJyCNCnUtZgqSXFzfeZ2qUPXGhxwVeZUyHXOpV0ORG7zIQF6zBGiqeC3u1GZ16oogtIZaoRe+QMpeTiCvLgGb1ZZ3tHZEiUJtJrCpgkGw1wwEDbkhEC4oJ4OAuPpr12JtepA0pbnNTvk81LoV6fgqJAMlotQR8Opc7TItDSTyx9UkffGUrLTepHDYSDZoGop0LTsuQ24w80FpUgmwOeM1h/n85AqSpuFU9cnqUietJFENkwoXcRcI2Cy7Zh0pAZhPDQNMMuSa5trN3YjcYOaD0lQQMGQCar9YatbksKJNA9F6S0WPBmlk6AVU2y+SN64jysWlXDxmg81Lk7dJG7Dkh5S1avZgkBvsWUEzSQTYnKTpoZ3AUkvYLNJqcqFUaj7VktL612pCWEkCoftFu/hK3rgOk2tPqUjrikEQSw1qpGyvaYMXucGGEnQSRkCcn17pQV0ReIbgJlyHDqZNmzJv7skzZ0xrampIGA6EGw8Co6PZgcNHXnvtrcGjQywivpqLy7p4TGrmfCC1jNkGMvFig9zgRQbypBLQLvqSUNXhc5UdsPTAs8Wpp5x42pIFTc2N7lfZ5N0rtKTSQdzVIlBX19ziTJnSeuIJM196ec9bb+8Tr0UoKGlZ167vUtooa1OQG8qKF84rTcBr0edbAUNAoi0/poNpU6csXjSvublpbCyTz2cMHlAEAmYC9ZQhmpuWLJ5/9OjQ4NFjPAGomSBcGpDyjTkYcylyg5kPSmuHAE8P2vzhlRio/XNOPaGpqXFkZLR2WKAlVSKQzeezI6M0nObOPen3L/XzBKAeUIDa9KAVstaoCaaUViI3lEIPtvEioF30pRC1OobEQOa0b8jmclpD0Xkul/P98mQpmMqYxKuTEI3jZLO56dOmsFVezQri6q/NBGwoSplAOtUaBmKP3BAIF5RjSkA7W7SxqjeXxEWfH4sH9Q0NmbGs1hulDLozcOzY8AktLTNbGw8OZw6MjEyZ3DplyuT6+jqzSWvL5JbW5uHhoZGRochNtFVDGBMCuVy2ocF9RwNbwfk6rh5wHXPk2h2D/aTQOkdu0GKBsAYJiDmAN883MbDJSW8yVImMjo4dOzz48TMWXLTklJNaGp18zqmrf2ck+/jLb/2P3706efpUurMsWZHJwOGj73nPGUuWLGltbaHNCN2AHh4eefnlV3734ovTp0+JxEQNFZK4EShsRN23roZODzyRlKlpyA1lAgu3lSOgXfSl6kUd/rzOOjG401hySKt8/fDwN1e/p63ZcYYGskNFhdlO3Zr2aR2n/uGXnv7dSD4vrvVkMjSc+dCHzm9paclkRgcHjz/AOO20RfPnz+3u3kkVlWhiz3042zrw1qv1rU1zTpiRcTTJz94VNIMSYCOKre/iX/LDTsUD6ZjXRZq+tzG5t6AR1gc1gD4IJI6AurL7NkE0oWPpRc8Jjh0Z3LCsfX5uMHd0IDdyLDcyNP7vGEkW5I/87bL2wUOH2YMKMieTw0eOrVy5vK6OcspwZuKLJDTJOzqWDwwcKcVEDtT7fCjTcmR0/nV//92vr/vA8IFDDfnCdSxelSXAFn1xrTeMTApNKlVvkBrMgxZh3xCUGPRrgQCbZuoGQpp+7JQtF2Kz6RnDn7fNmJc/lj3mXvuP5vLN408X+DF9GuLP22c9sndoypRJpEMmS05bTI8uRkdHPAhmGhqblpx22uuvvaqavP76GwOHDomGM2bOnDdvrmTi4VkjrsvRQpMZHaa3X43l6txrVXnh0RhBFBkBPrT4IBSfGVCpVs6r1z5giCy4giPkhmh5wltFCUS1oPF5yKLn85ZOWWKQKhoaHjlv9rTs0QEqHs05/+HXh65/19R3TW18aTDz9ZcG//4DM5tpQz46dOGJk37UPzJ5civ5IZM5c+aMjgwbYs5ms3PnzX35pZdVk4GBgRkzZkyfMZ1FeHjgMElOOeVkycSL/oH9A0eH8+8+ZfJQY/PQ2KRDe19tndLUOrnuO1/4fK6hZcmp00byzki2YfDQfrrrVd/UMGd6Y33rdDI6Oji05OTW0abpB/btOzrivPvUSUcbph3a+9axXOP8U4vBeFUKuYGAOAxYJhD/ioZMziUhsgKrK6gh7ikZug9FtUBAXYtViXni0d0W6d/sBmd2big7fCw7MtSQGblhxR/c9q9Htr5xhP5e/8F3k4TkVDord2xG4WYN/WumD1U31GXoDU/ZjNc/KiWdxqYm1YSSVOukVnp8Xfw3ifJNnvxIJmqoTPL+L3z3oQe+tDg3nB1uONLw3q89cPe3Lmkfyi687YG7f7T+A/v3HT421jqYn/eJL9625YGNd3/trzrmTT1wcGT+Jbc/9MDXLjqpbv/+sWU3/+ChB9Yvmzxy8J3s6ls3/ejbn/CqC3JLAmwceo1GUU7LOnvRQFX1VUkk8xb7hkgwwklSCfB5JU1FOqXZyP+KpbTUT29wckNH82PFu0MLDuy+6r3z/8sv9/z1mQsWHerNjd81qsu5mgPZHHmimz+jo6O0lhOp/v49+/cfFJGdcMKs9vY2JmlqbKT3v0smFAClAfLAdOi4ICl+SJuZeL1rlkxe7P599v2nL3936zPPH5ly5tkLnCPbdr066szlMRwdbL3kzus+Muu1Z37y6NH3XPSJ6684+J+/+/Tzu8cuOLNt3rR87wl/5EY377STp+TemfP+uc7wv7xQpiUpqSMpYNxmevwanx2wcRiwhlLVkRtKJQj7OBMwz0A1cq2+e9nvfokSf9UdGcu5wmzxQw+vHDx29+uvffHsRZt/0z93buZd7vOFwqshOzBWX0en+bqx0RFa8dlqvmTJ4j/4gwlvb6W1nh5HkwU9qaa3MzU3N0gm9JbHbM7dJjDHdEwSdspNKKTxiuX/h1/Y+WLuPe/64KLcc72nn9vuHH22pz9TP7moRq6aPvCxi07OvfCdr39r10D9/Nx7v/7RzndP7v7tv+xxzpz7hye1/OvpSxrefP7tU0478+SWvWe0Nzmv/fpNQ3Vy9ThXCHB6fEPA0kC4ZFCO5IHcoHQaBDVNQFz9tZmAt56V0l/2EqkczNbvHR490XFX6tF83d+90XTTsrZFx96cv3TB13/Z/422seY6d5neO9IwkG+ZUXjKOzY2dvToMXZpPzh41Ivx6OjRTJb2BC2SCcVw5Mjg6EgxN4yMus8tMhk3OYkmXm6d4Ze2/y733tPPbpueW/6uhqO/fOZ12heNa9Meaeopsxqd+j+87lsPXleUjk1pbjz2yq/ecpa0v2vR6WfMOvDrh18496wzzmjf/a4TnLd//uqhfH48t3jWigJPAuLYo2O+SfUyYDqsVDz20i9djtxQOkN4qAIBcWp5VW+jwyeb6EQypFNJ0tLc+OSBsUtmOU4u21RX/+2Vi+re2J0dHW4fHvp2x2Kn/3f0llWnvuHJg/VNTU3MlkzeeOPNuXNPpTezegVMb2MlHa3JlKlTBg8fGTpW/G7nOqdu6vRptG+QTLw851saf/vUS7l/f/q5Z+X+oHX4Nz29rc0tRV+0WXHyR/cdzjrz3vjxN7/zfw4XnGSbjuzPOJN/87vBT3ac/kdLT830//iFf1mQWfW+s99/ojP427cP0b7Jc5viFQbknACnRwf8DhKVmk8NACVDVZPVKNal6ogS5AYzH5TWFIFwy1nhltKEdbCpuenRwyMfnFzf1jDq0Dez7v4t85wfGqRjV7murn+s8bHDDa1TG11zxyGTvXv30huNWpqbtWHQpB0aGt67d9/UqZNUk2lTp8+cSbno+IseadOdKMnEq7daGuqPvbDr97mrz//4B1uGf9O9O5NvnMmV6dnG8K//15MHzrjoY5ddPPXZ3x+bvWjm7p6H3q5rbn39V72UDy54b/7Vu9481PebN+ovveBsJ/f/fvt6piVX2BvhFY4A62LfBd3LeWhDL4eqHLlBZQJJKgioC7QoKa71hWWdjlXlxsmT7nw7959OHGtvHHWkG/11dX1jzf9lX2uT+26i428saZ3UsvuV3ra2BS0tcnqgxDAyOtrf9+qkSfQx65JMtJ3XVD88cuR321/O/+W7m0Z/9XTfSDbX0MC/B4T2Dc1NA/dv+G+jn/74+ed/7I9H9/3rs3smN9U1j9UN9/7Lq877Fjn7X+4fzB15+YWDTtssetjw6jt5ygzIDVrYVkI2qPhVPJ1Kt5WYRPSlSqxqCqtUt3jxYql6dsonAx08//zzYf3DDgQ8CZx55plUxqYHnyTqAbcXt8PqYs1dcX1VR5SII5yZiBJ2zP6ecfoS7VuA6LMFmaHhiyYdPW/K8Mn1Y8zJ27nGbUdbfzo0rXFSC/s+NbH9ZDI0NDpzxoyZs2Y1NhZ/P45uDR08dIg+stDa2hSJiZZ43mkaPHx4NJNtbqqbSd8sW+eMZqcMDbztNNbNnuaejmSbR44dKbwDqq61uW7W1OZRp3EkO3Vo4K2sUz9/Rv1g/axjA/vow32zJzn1k6YiM2g5Wwrp+f//feH3NKTZi49efsol2gNRyGsUJ4hXGDY6zBb7Bi+GkCebgJoYLNsjGdJp4aWxpnv9TZMnPTHW/Mi+zHQnM70+ezjXcLiukV5NkxvpUa9qRiaTJ7ccPXaUPrlGX8zX0FifzdDjhxyZTJrUEpWJJlZXNDp1mruPoVeGLvkpV9QPNs2awk+b60eap9Kuxd240Is+DUcbmOb6I80FnWOOU+8cmzqj+PyZ3RJhmvgbgoA4NuhYuu6xX8HFqiU/IaISTZAbSgQI89on4JUbWMvp56Pp35jTsq8ww8ffv6rmheOgmAmdk1Lz8V+fjtik9jsmyS3knR3tgh4hEuSGCGHCVawJiEuvaRkeb8Tx2Wt9kWzjVmJUGZNYd0wqg2OfbxATg02SCKpfClrkhlLowbZ2CBjW6ML7lGqnpWhJHAi4bwGeeCtJjcpXQTWJUILcECFMuKoRAlKeoLygfd5QI61FM6pBwOtio7r5QCSB3FCNcYE6Y0NATgMTk0CxVFKKTfAIJMEElJFmeBxdlYSB3JDg0YXQvQhEu5j/z//1qFdFkINAaAJnnHFGaFsvwwizSPE7uie99z88+Pht583GV3Z7MYccBEAABFJEoJgMhl58+J9e/6Nr/mJJ8f3PKSKApiaJAF0WsVe5g+Y7j2i3IOUOG/6TSKCSg81+Bo1vFLJvPfXQi7M/+hcfmIqfFE/i6ELMIAACiSQQ24sPfhMpd+j//PNLk8/9N+9XkwOyRSLHHIIGARCIOYHYJgbidvwBQ27gxedeb/3AqoXFj8wfh4qHEDEfYAivVAJxnqKltg32cSVgM+psdMrUPmHdz+z//etj0979bvotXLxAoMYIVHGO1RhJNCc+BMo6qsU9QebwW0ecmXNnyO9rLf7wYXyIIBIQAAEQAIGyEhBzQz6byTsNTY14vlBW5HCeEAJlvShLCAOEWTkCcRtvYm6ob53e4gwdHPL8ycLKYUJNIFAtAnGbotXigHqrRSAmI1DIDfWTT10wNffW7n3FHympFhnUCwLlJRCTuVfeRsJ7jRKo2OgVckNL29IFzp6fvXzU61ugapQ1mgUCIAACICAROJ4bWhZ2nDX11W0/25uRIcnPpuVynINATRCo2BVZTdBCI8pLoOqjkeeG1nd9pGv6iz/+6avKHaU69xcB8QKBpBCwn1T2mklpO+KsVQL2Y9Ve08yqmBvqZy697Ly6p36wfa/6htVJC80uUAoCIAACIFBjBIr3i5pnTnrxnjsf++Wg5lnDsV/XWJvRHBAAARAAATOBYm4Y7vvplj6zJkpBAARAAATSQkD8fENa2ox2ggAIgAAImAkgN5j5oDTVBKJ6rJdqiGi8BYEYjjTkBot+g0rCCcRw4iWcKMKPC4HyjW3khrj0MeIAARAAgfgQQG6IT18gkrgQKN+1WFxaiDjiSiA+Yw+5Ia5jBHGBAAiAQPUIIDdUjz1qBgEQAIG4EkBuiGvPIC4QAAEQqB4B5IbqsUfNIAACIBBXAsgNce0ZxBUPAvF5NhgPHogiegLxHGPIDdH3NDyCAAiAgCWBeCYGCh65wbIHoVazBGI7OWuWOBo2TsBm7NnolIMockM5qMInCIAACPgQqNai7xPWeDFygyUoqIEACIBAigggN6Sos9FUEAABELAkgNxgCQpqIAACIJAiAsgNKepsNBUEQAAELAkgN1iCghoIgAAIpIgAckOKOhtNBQEQAAFLAsgNlqCgBgIgAAIpIoDckKLORlNBAARAwJIAcoMlKKiBAAiAQIoIIDekqLNj0lT6OCh72cdjb+L7WVOuoNU0l9oHDE0QCEHAPPzMpWJ12rEtxeM7p5AbQvQgTEAABECgxgkgN9R4B6N5IAACIBCCAHJDCGgwAQEQAIEaJ4DcUOMdjOaBAAiAQAgCyA0hoMEEBEAABGqcQGONtw/NAwEQiJrArNmzw7k8eOBAOENYVZ4AckPlmaNGEEgYgdDJQGqn5AepIs7jALkhzr2D2ECgmgSiSglebeD+kSS8EFVRjtxQRfioGgTiSKDcKUFtM5KEyqTqEuSGqncBAgCBuBCofFaQWs4CwDYiDgMCuSEOvYAYQKDKBKqeFcT2I0NUeTQUqkduiEMvIAYQqBqBWGUFkQIyRNXGRKFi5Ibq8kftIFA1ArHNCiIRZIhqjQ/khmqRR70gUDUCicgKyBBVGx+FivG56OryR+0gUGkCiUsMHFByI690H0dRH/YNUVCEDxBIAoEaWFtxi6liAw37hoqhRkUgUE0CNZAYOL5aaks1x4SxbuQGIx4UgkBNEKi9xbT2WhS3gYbcELceQTwgEDGBWl1Ga7VdEXd/WHfIDWHJwQ4EkkCgthfQ2m5ddccXnkVXlz9qB4FyEUjJusmaia/ZiHwYYd8QOVI4BIHqE0hJYuCg09beCoww5IYKQEYVIAACIJAwAsgNCeswhAsCvgTSeRGdzlb7DobQCsgNodHBEATiSCDNS2Sa2x75WERu78ia/AAAEh9JREFUiBwpHIJA1QhgcQSBqAYfckNUJOEHBKpMAMsi6wBwiGQgIjdEghFOQKDKBLAgih0AGqUPR+SG0hnCAwiAAAjUGgHkhlrrUbQnhQRwmax2OpioTAJJkBsC4YIyCMSOABZBry4BGS8yNnLkBhtK0AEBEACBdBFAbkhXf6O1NUYAl8bmDgUfMx9DKXKDAQ6KQAAEQCClBJAbUtrxaHYNEMBFsU0ngpINJVUHuUFlAgkIgAAIpJ0AckPaRwDan1ACuBy27ziwsmfFNZEbQkCDCQiAAAjUOAHkhhrvYDSvJgngQjhot4JYUGLIDUGJQR8EQAAEap8AckPt9zFaWGMEcAkcrkPBLRA35IZAuKAMAiAAAqkggNyQim5GI0EABEAgEAHkhkC4oAwCVSaAGyOldADo2dNDbrBnBU0QAAEQSAsB5Ia09DTaCQIgAAL2BJAb7FlBEwSqTAC3RErvADC0ZIjcYAkKaiAAAiCQIgLIDSnqbDQVBEAABCwJIDdYgoIaCIAACKSIAHJDijobTQUBEAABSwLIDZagoAYCVSaAh6hRdQBI2pBEbrChBB0QAAEQSBcB5IZ09TdaCwIgAAI2BJAbbChBBwRAAATSRQC5IV39jdaCAAiAgA0B5AYbStABARAAgXQRQG5IV3+jtSAAAiBgQwC5wYYSdEAABEAgXQSQG9LV32gtCIAACNgQQG6woQQdEKgyAXxcq8odkL7qkRvS1+docQIJHDxwIIFRI+QEE0BuSHDnIXQQAAEQKBMB5IYygYVbEAABEEgwAeSGBHceQgcBEACBMhFAbigTWLgFARAAgQQTQG5IcOchdBAAARAoE4HGlpYW5jqfz3sdlKluuE05gebmZiJQV3gxFF4HfHAyfS9uXI35Ea3IxGuEMzn/SwfqsVeNkINAaAKNjY00UOvr69kU4BOBn/LRzsaz1+zgAXAFMSStUBuzpIl9g5YShCAAAiCQagLIDanufjQeBEAABLQEkBu0WCAEARCoWQL4IKFN1yI32FCCDghUnwBWtOr3QZoiQG5IU2+jrSAAAiBgRwC5wY4TtEAABEAgTQSQG9LU22grCIAACNgRQG6w4wQtEIgBATxyKL0TwNCSIXKDJSiogQAIgECKCCA3pKiz0VQQAAEQsCSA3GAJCmogEAsCuCVSSjeAnj095AZ7VtAEARAAgbQQQG5IS0+jnSAAAiBgTwC5wZ4VNEEgFgRwYyRcN4BbIG7IDYFwQRkEQAAEUkEAuSEV3YxG1hgBXAIH7VAQC0oMuSEoMeiDAAiAQO0TaBwZGRFb6fXbWLVPAi2sOIHR0VGq0+Y3rdiw9P0FK1LgA1g7qkloGOHSL74xZa3DiqPSVEgXwrNmz9YUQKQQiOemIZPJ0IgVXxQ4OxUP2DFrE58C4lwQj3nTtUIFjCvw0sS+QYsLQhAAARBINQHkhlR3PxqfaALxvByOG1JQCtcjyA3huMEKBEAABGqZAHJDLfcu2lbzBHBRbO5i8DHzMZQiNxjgoAgEQAAEUkoAuSGlHY9m1wwBXBp7dSXIeJGxkSM32FCCDgjEmgAWQbV7wERlEkiC3BAIF5RBAARAIBUEkBtS0c1oZM0TwGWy2MWgUfqAR24onSE8gEAsCGBBZN0ADpEMR+SGSDDCCQjEggCWRRCIaiAiN0RFEn5AIBYE0rw4prntkQ8+5IbIkcIhCFSZQDqXyHS2unxDDbmhfGzhGQRAAASSSgC5Iak9h7hBwEAgbRfRaWuvoeujKmqMyhH8gAAIxIoAWy5r/jcekBXKNOqwbygTWLgFgVgQqO2ls7ZbV90B5JkbtD8wVN1YUXvtEWDDzGawef06FWNCpWaF2kNn36JaXUBrtV32PVtWTc/cUNZa4RwEQKCSBGpvGa29FlVyPNjUhdxgQwk6IJB4ArW0mNZSW2I7sPAsOrZdg8BAIGICbElN9NNpZIWIx4S3O+wbvNmgBARqkUByl9fkRp7EcYR9QxJ7DTGDQEkEEreBQFYoqb9DGSM3hMIGIxBIPoFEZAhkhWoNNOSGapFHvSAQCwKxzRDICtUdH8gN1eWfxtpDfBCBf3whn8+bkZGmWYcraDXNpeaqE10aqwyR2qzAp4Z2jphLxeGnNZfGp68OckOiZzSCB4EoCVQ9Q6Q2K0TZixH5Qm6ICCTcgECtEOALdMXe7YqUEMOxg9wQw05BSCAQCwLlThJICbHoZo8gkBs8wEAMAiAwTkBaxEPvJ5AMEjSmkBsS1FkIFQRiQQBLfCy6ocxB4HPRZQYM9yAAAiCQQALIDQnsNIQMAiAAAmUmgNxQZsBwDwIgAAIJJCDnBt8PRCSwjQg5eQQwDpPXZ4i4tghYPYseGBiorVajNSAAAiBQZQIxvwCS9w1VpoXqQaDiBGI+RSvOAxVWjoDN2LPRKUfEyA3loAqfIAACIGBFoFpLv29w9bGNzDd0KKSHQBVHaRWrTk//pryl8Rxj2DekfFii+SAAAiCgIVD23LBo0SJNtYrIV81XgVza6Cg1hxRUsq6QIcIMBEAABMISML1PiXY60lfhGxbE3t5e+xhEP4EM7asQNX3D5gosGEmfRyjJK9yKcG1PkFU8d9YJAohQQSBCAqbcoFbjtY6bF011DZX8MAVpgVZr10rMVXMTcX1X13qSkB+eGMTwJP9eBLSxQWgmgGRg5oNSEKgigWC5gQLla6g5aHENVddiyVZamsVSqTq2UksLdOnrtZicWDCG1knZgjRLD8BQHYoqT0DdMVc+BtSYTgLxuWAKnBssO0xdQEVDsdSwsKp5yLxwi/rapMJiUGMTkxPpGEJipdy5GqElH6hxAvGZDOgUEAABTiBMblDXVhWo/fKq2gaVsHjEGtUlm5dK+UOsixWprVPbwlOUWhQ0eOhXgAD2ARWAjCqqQqB8l1ZhckOEC6K6iPvyZeuyGIO4Uns5FFd8dfVnlUqeta4kW34aIRNfAlCoGAEklYqhTnlF5VviQ4MNkxssK9MuwWwN1S67kttAOmrCkLzxtVt0yyO0WeKlePiptpmWiKAGAiAAAvEkEFlu0C7l0tW0tIyyU/a39Otu5kFNEtrAfDuDx+YbmKgQVVt8w4MCJxDDCy70DgjUAAE3N0S7cRbXYikZiLx81QyLsqEoXJewjCLaqjnG1zNrkaHJvh6goCWA1V+LBUIQKCsBzb7BN1Volz/tei0JuaF0rc1OWamXiUqBe1Pj0boSPRgURG9cTapCrZE595KrwUNiIIBkYICDIhCoDIG6JUuWUE3S55/5KTt46qmnKhMNakkVgVWrVlF7eSZQDxgNMVVIA1U0F9GpaqJEPWYS6S8/feGFF1LVL2hsZQicfvrpNLb5iw1mNtq9/qozQpwdaqmhIaqhpOzzfUq+9oa6UQQC9gTiMNLiEIM9MWjWNoGqj0af3FDb9NG6qhOo+gSoOgEEAALxJFDMDZii8eweRFWOkVkOn+gpEKgMgYqNXv2+oWLVV4YmakkQgaqPvaoHkKDOQqjlIBCTEah5n5LUWgp09erVJFSf4Ima6tM/yY+vQjkow2e5CfiOY1XBRlLusG38U5wYtDagoBMJAXVeROI2tBP/3MBdm6cKa5hhLkktN2iGbgwMK0DAfgT7avoqVKA5qAIEQEBLwDM3+GYC7eLumyF4EOZ1Qetc2wAIIydg7hqb6gweDEXk2VwqVR1UGYPKpu+gkyACgaZA0HYdzw1Ujdfk4UWiDgtLa2IosoyvrG22jAFqIQgYOk4q4qf2JiHisTQRB7alCdRAoEQChpHPPdvolBiGl7nnvsHLQJpFhknFW6XNH17+IU8iAd8RLCn46icRAmIGgaAE4jwRJuQGy3XfUo1j0rYfCSPoMIqJvrY3zbFZJgZLNXNdKAWBZBEIMaEq00DbfYOUD6TgePPsV/zSidjXVRmUiaildOz2zbSpy0ZHrJHpm0ejfYQGTV5F0AgNPlEEAloCfIxVYLDZVyHnBmnWiafSMTVSXZ15xWqRFkopQvtGllILbIMSMPSLVCSeGoqCBgB9EACB0gnIuUH16JUeSJPNZ20a8FogtMpqpZDEn4BXF2sjV5UNiUHrgQtVV6q+OGjVUkhAoFYJ2MwOy7ZrcoM6r0SJtpRX5rv0Rxi6ZQuhVi0Chr4Wi1Q1VVK+Jkjj2XxavjDgOeUEpDFvPq0MK01uoIqlGSKFwuLWpgHtrNZqVqZ5qKUyBLT9rq3aV9OsYC7V1hhCaB7/IRzCBAQsCVRmhNsEo88NZClNDxaxuMrzNvgu/WVqrW+9Nu1Pm06Z+sIXo7ZeVahKRM/mUt8YzArkHCPKjAil0RLwHc++CtHGI3nzzA2kp84WVcLURKcVm2DVBVfWXqkB5769oyqoEpGDudSGmDh6tSNZcmKjY1MvdEDAi4A4qm1GeFB9r3pt5KbcQPbq9GDBGRKAVwsNJjaBQieeBLy62xCt1kQrNDhBEQjUBoHYjvxGdfWXiGsVfDOE2m2xRaCGCkmZCHiNAS85D8NXQQ1YO25VNVUiGYaoWvUJCQgYCEhjLPSQC22ojc3dNzCPhut6r2nGQzHYamuFMFUEzEO2lNJIMHoN70icwwkIlEjAPEFKdG4w97mnxC3N80eNHtnCAL22i9TBYGhvIGWDnxBF6pAWJexY1QlREUxAQEtAHPzsWJWIhhWeLMdzg+808FUI1AwkD+1wib8wwgHq68pXISiuQGM4qHPog0BQAqFHeGhD+wjrTjvtNFHbZsm20bGPAJopJGAzsm10fIeiqiBK1GMuoQN2zP+qEuo4UZ/1I5eIpVIXizo2vR9U38YndDgBm5Em4vLSF+X8WDpgp/wvHagSVpcoFyXqsZdE6mIeiWXXy/eUyN53ILI6fNUsI4BaqghYDlBLtRDoxBFuHu2sVNUX5bxUPKCo2OzgrZAmC5ez+H2nkqQfotUwKYWAmb9UKp7yY3ag/mVRiXKvOLVuvZQjkcu5gZxSEL6DlanRXxvNSAKFk6QTkKaQoTn2mgYnrMhyMHM/Bn21iEm4XFRgTeCzQ2yROmXEUm2LVBOtGoThCPjyV91qTSQhP2UHqokqEcehWqlBYnBlsDIXaXIDGVBNlsNRjMnSxBwQSmuJQIghG8KkFGJ8qEtjnp2qpVo5i5nGPw+ezQXplMXJhTxs34mjmpTSZNgGJWDmL5WKp/xYOvCVS0PFHEDQ5ljq63MDGVM0vkNWqkNtQFAPlkFDLZ4E1AEQNM7SPag1qiNZlYhWaimXsAPxrzhTWPBiVuDjX2qXNC+kUrUJogRzyszHsjQQc8mnl60o1x4zofiXjR9L/0xNrV2VWEIwq3nmBhZ0iQMxdNAl1mtuM0rNBEL3mtmtb2mIeplJVKOFvImu2CkXiqf8mBpFJmIY6jFvuFeqUMkYWsT8qyaQREXAnrBWUxTyY+mAnWqFvBVa5+HaGM6VKTdQHOTUMEzDBWpjFa4xNp6hE08CFe5xcWCrg9xLwuTiX3GO8CbwbMFQm1OCdn5VmEY8h0SsojL3iFTqdcrk6l+xpWpFokQtLR8ln9wgDv3yBQHPKSdQ7hFP/rVLMMfOFSRNdmr4Sx7ETMBq4c2RTqVeNpemfEjEs/nmgSqViqf8mB14/RUHJDs210g6vgqhSfrnBla9eWqFrh6GIFD64CYPvuNT1ZEk/JQdaE/FIha2lBiYkPrUsO7zULlyiWPAt+0l+q8B86hQcxQGh2KR9pgJ1b/kXBTyU0OlhjAMVpYdapUbLH1BDQTiTIAmkrSMqhIxfl7KDqS/pMkTg5QJxIQhOjQkDHtuaiawWSDs/adEMxJoXk4kOT+VDtipWqrtArUuVaI1DC20zQ0sDnVchq4YhiAQ4eAOPT7JkI9qfux1wOS8LumAdaghMYRurzjvQjvBePMiUApSL1tJzk+lAy85hSp68KrFq0VMHs6K+7TNDbwypAdzf6DUkkCJA1dbC/k0j09WqaQjWvFjrwPuQTpg8WgTA6suRHvFpKVtL4TREgjRRywAraEk5KeBDsi/6lyVqBxsdFQrURIsN/BAzTPQXCVKU06g9FFbIkAKwDI9UEVsuefru7jQi5lAmwC0Qq/g1TlVdVBeoaZHHqgLtMqiUHvMhNoi4qz6VCVl6o7AuYHFweNTB3SZAoXbpBOozJimWsKNSdFQPeYS1gopQ0hzmAdgbrIUp1k56b1fG/Fb9pGqJkrUY1UiLbNB6akBBPVA+v8fHxt6VCRUgxwAAAAASUVORK5CYII=" alt="" />

二、

在同一个窗口中使用MVC模式,控制器和视图都在同一个窗口中,可以使用鼠标拖动来控制半径,也可以使用输入来控制半径,同时面积和体积要同步更新。

难点:在同一个窗口中,控制器的数据怎么和视图的数据进行交互,而且要同步显示,控制器和视图相互交错,控制器也是视图,视图也是控制器。

代码如下:

模型:

 /**
* java MVC模式 模型部分
* 2016/5/22
*/
package circleMVC_x; import java.awt.Color;
import java.awt.event.*;
import java.util.*; public class CircleModel {
//圆半径
private double radius = 20; //是否填充
private boolean filled; //颜色
private java.awt.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 java.awt.Color getColor() {
return color;
} public void setColor(java.awt.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){
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);
}
}
}

模型

控制器:

 /**
* java MVC模式 控制器部分(其中面积,体积部分不能设置,算作视图)
* 2016/5/22
*/
package circleMVC_x; import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CircleController extends JPanel implements ActionListener{
private CircleModel model;
private JTextField jtfRadius = new JTextField();
private JTextField jtfArea = new JTextField();
private JTextField jtfVolume= new JTextField();
private JRadioButton jrbRed, jrbGreen, jrbBlue; //创建一个新的CircleController
public CircleController(){
JPanel panel1 = new JPanel();
panel1.setLayout(new GridLayout(3,1));
panel1.add(new JLabel("半径:"));
panel1.add(new JLabel("面积:"));
panel1.add(new JLabel("体积:")); //
JPanel panel2 = new JPanel();
panel2.setLayout(new GridLayout(3,1));
panel2.add(jtfRadius);
panel2.add(jtfArea);
panel2.add(jtfVolume); JPanel panel3 = new JPanel();
panel3.setLayout(new GridLayout(1, 3));
panel3.add(jrbRed = new JRadioButton("Red"));
panel3.add(jrbGreen = new JRadioButton("Green"));
panel3.add(jrbBlue = new JRadioButton("Blue")); setLayout(new BorderLayout());
add(panel1, BorderLayout.WEST);
add(panel2, BorderLayout.CENTER);
add(panel3, BorderLayout.SOUTH); //将三个单选框组成单选按钮
ButtonGroup group = new ButtonGroup();
group.add(jrbRed);
group.add(jrbGreen);
group.add(jrbBlue); jtfRadius.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if(model == null) return ;//还没有model
model.setRadius(new Double(jtfRadius.getText()).doubleValue());
}
}); //单选按钮监听
jrbRed.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(model == null) return;
model.setColor(Color.RED);
}
}); jrbGreen.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(model == null) return;
model.setColor(Color.GREEN);
}
}); jrbBlue.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(model == null) return;
model.setColor(Color.BLUE);
}
});
} public void setModel(CircleModel newModel){
model = newModel;
if(model != null){
//给model增加啊监听器
model.addActionListener(this);
}
} public CircleModel getModel() {
return model;
} @Override
public void actionPerformed(ActionEvent e) {
double radius = model.getRadius();
jtfRadius.setText(model.getRadius()+"");
double num_1 = 4 * Math.PI * radius * radius;
double num_1_1 = (Math.round(num_1 * 100) / 100.0);// 保留两位小数
jtfArea.setText(num_1_1+"");
double num_2 = 4 / 3 * Math.PI * radius * radius;
double num_2_2 = (Math.round(num_2 * 100) / 100.0);// 保留两位小数
jtfVolume.setText(num_2_2+""); }
}

控制器

视图:

 /**
* java MVC模式 视图部分
* 2016/5/22
*/
package circleMVC_x; import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CircleView extends JPanel implements ActionListener{
private CircleModel model; public CircleView(){
super.setBounds(12, 144, 426, 300);
repaint();
//增加鼠标监听事件
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e){
model = getModel(); int x = e.getX();
int y = e.getY();
int radius; double radius_d = Math.sqrt((x - (getWidth() / 2))
* (x - (getWidth() / 2)) + (y - (getHeight() / 2))
* (y - (getHeight() / 2))); radius = (int) radius_d; System.out.println("坐标:" + x + " " + y );
model.setRadius(radius);
repaint(); }
});
}
public void actionPerformed(ActionEvent actionEvent){
repaint();
} //设置一个model
public void setModel(CircleModel newModel) {
model = newModel; if(model != null){
//给model增加啊监听器
model.addActionListener(this);
} repaint();
} public CircleModel getModel(){
return model;
} public void paintComponent(Graphics g){
super.paintComponent(g); if(model == null) return; g.setColor(model.getColor()); int radius = (int)model.getRadius(); g.drawOval(getWidth() / 2 - radius, getHeight() / 2 - radius,
2 * radius, 2 * radius);
g.drawOval(getWidth() / 2 - radius / 2, getHeight() / 2 - radius,
radius, 2 * radius);
g.drawOval(getWidth() / 2 - radius, getHeight() / 2 - radius / 2,
2 * radius, radius);
}
}

视图

程序入口:

 /**
* javaMVC模式 入口
* 2016/6/20
*/
package circleMVC_x; import java.awt.BorderLayout;
import java.awt.EventQueue; import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.FlowLayout; public class MVCdemo_x extends JFrame { private JPanel contentPane;
private CircleController controller = new CircleController();
private CircleView view = new CircleView();
private CircleModel model = new CircleModel(); /**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MVCdemo_x frame = new MVCdemo_x();
frame.setSize(500, 500);
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
} /**
* Create the frame.
*/
public MVCdemo_x() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null); JPanel panel = new JPanel();
controller.setModel(model);
panel.add(controller);
panel.setBounds(57, 34, 310, 98);
contentPane.add(panel); view.setModel(model);
contentPane.add(view);
}
}

程序入口

运行结果:

aaarticlea/png;base64,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" alt="" />

java 图形界面 mvc模式控制的更多相关文章

  1. Java 图形界面开发--图文并茂建立学生管理系统

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/50932501 冷血之心的博客) 图形用户界面(Graphics U ...

  2. Java图形界面学习---------简易登录界面

    /** * @author Administrator * Java图形界面学习---------简易登录界面 * date:2015/10/31 */ import java.awt.BorderL ...

  3. Java图形界面GUI

    Java图形界面GUI 设置窗体JFrame对象 package com.Aha.Best; import javax.swing.ImageIcon; import javax.swing.JFra ...

  4. Java第5次实验提纲(Java图形界面编程)

    1. Swing与NetBeans 使用NetBeans编写简单界面.见GUI实验参考文件中的0.第06次实验(图形程序设计.事件处理与Swing).doc 题目1: Swing用户界面组件与事件处理 ...

  5. Java第05次实验提纲(Java图形界面编程)

    1. Swing与NetBeans 使用NetBeans编写简单界面.见GUI实验参考文件中的0.第06次实验(图形程序设计.事件处理与Swing).doc 题目1: Swing用户界面组件与事件处理 ...

  6. JAVA学习篇--JAVA两种编程模式控制

    在Drp项目中,解说了两种编程模式Model 1和Model2.以下是对这两种模式的简单理解.以及因为Model2是基于MVC架构的模式,就将我们易混淆的MVC与我们之前学的三层架构进行对照学习一下. ...

  7. centos7命令行与图形界面启动模式修改

    1.命令启动 systemctl set-default multi-user.target 2.图形界面模式 systemctl set-default graphical.target

  8. java 图形界面 Socket编程

    一.使用图形界面实现客户端服务器端的通信: 上代码: 服务器端代码: package cn.MyNET; import java.io.*; import java.net.*; import jav ...

  9. java 图形界面

    1.创建一个窗口框架 /** * java 用户界面框架 * 2016/5/10 */ package org.windows; import javax.swing.*; public class ...

随机推荐

  1. 免费DDOS攻击测试工具大合集

    FreeBuf微科普: DoS(Denial Of Service)攻击是指故意的攻击网络协议实现的缺陷或直接通过野蛮手段残忍地耗尽被攻击对象的资源,目的是让目标计算机或网络无法提供正常的服务或资源访 ...

  2. delphi 快捷键大全

    ************************* 1.功能键 2.组合键 3.其他快捷键 4.补充 5.补充1(带分类) 6.补充2 --Edit by 2013.1.14 ************ ...

  3. 一.Maven的安装和配置整理

    Maven的安装和配置 1.1安装                 进入Maven官网的下载页面:http://maven.apache.org/download.cgi选择当前最新版本:" ...

  4. 【Python之路】第五篇--Python基础之杂货铺

    字符串格式化 Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存. 1.百分号方式 ...

  5. CVE-2015-0057 POC构造 & 利用分析(2015.7)

    CVE-2015-0057 POC构造 & 利用分析 主要内容: 构造POC 利用思路 0x00 初探 从这篇文章可以获知: 1.问题出在 win32k!xxxEnableWndSBArrow ...

  6. 1.3 ODPS

    来源(完全照搬.仅做记录):http://blog.itpub.net/26613085/viewspace-1327313/ 注册odps账号注册地址:http://www.aliyun.com/p ...

  7. 安装aptana(1)

    以前在myeclipse8.5上装了aptana,现在用myeclipse2014了,但是用原来的方法没有安装上,网上搜了下,发现都是老的方法,对新版的myeclipse已经不适用了,下面是转载的一篇 ...

  8. Linux终端快捷操作汇总

    定位单词 在长段的命令中,使用 Ctrl + ← 和 Ctrl + → 可快速将光标定位到命令中单词的首字母或末尾,实现在各单词之间的快速跳动定位. 你可以试着在终端中输入 apt-get insta ...

  9. Spark Streaming的wordcount案例

    之前测试的一些spark案例都是采用离线处理,spark streaming的流处理一样可以运行经典的wordcount. 基本环境: spark-2.0.0 scala-2.11.0 IDEA-15 ...

  10. 利用StringBuffer向字符串特定的重复子字符串插入数据

    public class InsertDetail {    public void insertInvoiceDetail(StringBuffer sb, String Label, String ...