Swing组件采用MVC(MODEL-View-Controller,既模型-视图-控制器)设计模式,其中模型(Model)用于维护组件的各种状态,视图(View)是组件的可视化表现,控制器(Controller)用于控制对于各种事件,组件做出怎样的响应.当模型发送改变时,它会通知所有依赖它的视图,视图会根据模型数据更新自己.Swing使用UI代理来包装视图和控制器,还有另一个模型对象来维护该组件的状态.例如 , 按钮JButton有一个维护其状态信息的模型ButtonModel对象,Swing组件的模型是自动设置的,因此一般都使用JButton,而无须关系ButtonModel对象.因此,Swing组件的模型是自动设置的,因此一般都使用JButton,而无须关系ButtonModel对象.因此,Swing的MVC实现也被称为Model-Delegate(模型--代理)

 package Com.SwingTest;

 import java.awt.*;
import java.awt.event.*; public class SwingText_13
{
public static void main(String[] args)
{
new Calculate().launch();
}
} class Calculate extends Frame
{
private boolean firstFlag = true;
private String str1 = "";
private String str2 = "";
private TextField tf = null;
private String strOper = null; //20行 strOper用来记录到底是+还是-还是*还是/操作,因为我们点击"="按钮时是无法通过该事件得到上次我们执行的到底是+还是-还是*还是/操作,所以我们需要定义一个属性strOper来记录单击"="之前的上次执行的操作 public void launch()
{
Frame f = new Frame();
f.setTitle("简单实现的计算器");
tf = new TextField(30);
tf.setBackground(Color.WHITE);
//setLayout(new BorderLayout()); //Frame默认的布局管理器就是BorderLayout
f.add(tf, BorderLayout.NORTH);
Panel p = new Panel(new GridLayout(4, 4, 5, 5));
for (int i=0; i<10; ++i)
{
Button bn = new Button("" + i);
bn.setActionCommand("数字");
p.add(bn);
bn.addActionListener(new MyMonitor());
} Button bnAdd = new Button("+");
p.add(bnAdd);
bnAdd.setActionCommand("算术操作");
bnAdd.addActionListener(new MyMonitor()); Button bnSub = new Button("-");
p.add(bnSub);
bnSub.setActionCommand("算术操作");
bnSub.addActionListener(new MyMonitor()); Button bnMult = new Button("*");
bnMult.addActionListener(new MyMonitor());
p.add(bnMult);
bnMult.setActionCommand("算术操作"); Button bnDiv = new Button("/");
p.add(bnDiv);
bnDiv.setActionCommand("算术操作");
bnDiv.addActionListener(new MyMonitor()); Button bnEq = new Button("=");
p.add(bnEq);
bnEq.setActionCommand("=");
bnEq.addActionListener(new MyMonitor()); Button bnClear = new Button("清零");
p.add(bnClear);
bnClear.setActionCommand("清零");
bnClear.addActionListener(new MyMonitor()); p.add(bnAdd);
p.add(bnSub);
p.add(bnMult);
p.add(bnDiv);
p.add(bnEq);
p.add(bnClear); f.add(p, BorderLayout.CENTER);
f.setBounds(200, 200,300, 300);
f.setBackground(Color.CYAN);
f.setVisible(true);
f.addWindowListener( new WindowAdapter()
{
@Override
public void windowClosing(WindowEvent e)
{
System.exit(-1);
}
}
);
} //内部类
class MyMonitor implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
//如果是对=按钮的点击操作,则我们需要得到上次动作命令名称的信息,因为本次事件中只能得到按钮标签的信息= 和 按钮动作命令名称=, 无法得到上次执行的到底是+还是-还是*还是/操作,所以我们需要单独定义一个属性用来记录动作命令名称的信息,参见20行代码
/*actionPerformed()方法算法如下:
第一: 我们必须先得通过e得到按钮的动作命令名称strAc和按钮标签字符串的
信息strLab
第二: 然后通过判断按钮的动作命令名称strAc来执行不同的操作,即:
如果strAc是"数字",即如果是对0-9按钮的单击操作, 则更新str1 或者 str2的值
如果strAc是"算术操作",即如果是对"+" "-" "*" "/"按钮的单击操作,则我们必须得把按钮标签字符窜strLb的值赋给属性strOper, 注意不能把strAc赋给strOper, 因为此时strAc的值是"算术操作"
如果strAc是"=", 则。。。。。。略
如果strAc是"清零",则。。。。。。略 */ String strAc = e.getActionCommand();
Button bn = (Button)e.getSource();
String strLb = bn.getLabel(); if (strAc.equals("数字"))
{
if (firstFlag)
{
str1 = str1 + strLb; //
tf.setText(str1);
}
else
{
str2 = str2 + strLb; //
tf.setText(str2);
}
}
else if (strAc.equals("算术操作")) //如果是+ - * / 操作
{
strOper = strLb; //118 千万不要写成了 strOper = strAc; 因为本语句要被执行的话,此时strAc的值一定是"算术操作", 我们需要的是+ - * / 即我们需要的是按钮标签字符窜的信息
firstFlag = false;
}
else if (strAc.equals("="))
{
result();
}
else if (strAc.equals("清零"))
{
str1 = str2 = "";
tf.setText("");
firstFlag = true;
}
}
} public void result()
{
double num1 = Double.parseDouble(str1);
double num2 = Double.parseDouble(str2);
double num3 = 0; if (strOper.equals("+"))
{
num3 = num1 + num2;
}
else if (strOper.equals("-"))
{
num3 = num1 - num2;
}
else if (strOper.equals("*"))
{
num3 = num1 * num2;
}
else if (strOper.equals("/"))
{
num3 = num1 / num2;
} tf.setText("" + num3);
str1 = String.valueOf(num3); //不能写成了 str1 = str2;
str2 = "";
//firstFlag = false; //本行代码可以省略
}
}

MODEL-View-Controller,既模型-视图-控制器的更多相关文章

  1. 设计模式 --- 模型-视图-控制器(Model View Controller)

    模型-视图-控制器(Model-View-Controller,MVC)是Xerox PARC在20世纪80年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已广泛应用于用户交互应用程 ...

  2. MVC(Model View Controller)框架

    MVC框架 同义词 MVC一般指MVC框架 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一 ...

  3. 深入浅出Java MVC(Model View Controller) ---- (JSP + servlet + javabean实例)

    在DRP中终于接触到了MVC,感触是确实这样的架构系统灵活性不少,现在感触最深的就是使用tomcat作为服务器发布比IIS好多了,起码发布很简单,使用起来方便. 首先来简单的学习一下MVC的基础知识, ...

  4. 模型-视图-控制器模式(MVC模式,10种常见体系架构模式之一)

    一.简介: 架构模式是一个通用的.可重用的解决方案,用于在给定上下文中的软件体系结构中经常出现的问题.架构模式与软件设计模式类似,但具有更广泛的范围. 模型-视图-控制器模式,也称为MVC模式.是软件 ...

  5. 设计模式-结构型模式, mvc 模型视图控制器模式(8)

    MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式.这种模式用于应用程序的分层开发. Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO.它 ...

  6. 学习模型-视图-控制器MVC模式

    1.MVC简介 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分 ...

  7. [框架模式]经典的模型视图控制器模式MVC

    参考:<设计模式> http://blog.csdn.net/u010168160/article/details/43150049 百度百科 引言: Model(模型)是应用程序中用于处 ...

  8. 模型-视图-控制器的C++解释

    模型-视图-控制器 (MVC) 并非一种技术,而是软件设计/工程的一个概念.MVC包含三个组成部分,如下图所示 模型 模型直接响应对数据的处理,比如数据库.模型不应依赖其它组成部分,即视图或控制器,换 ...

  9. MVC模式 - Model-View-Controller -(模型-视图-控制器)

    MVC(Model View Controller) MVC是一种设计典范.它是用一种业务逻辑.数据与界面显示分离的方法来组织代码,将众多的业务逻辑聚集到一个部件上,在需要改进和个性化定制界面及用户交 ...

随机推荐

  1. appium操作微信公众号H5 web页面

    安卓微信公众号的H5页面是webview,一般操作需要切换context. 在执行如下步骤,就能直接像识别native样识别webview 1.代码追加: ChromeOptions options ...

  2. Windows XP忘记密码的几种解决方法

    1. 问题 朋友一Windows XP系统的密码忘记了,让给解决一下.网上搜索了几种解决方案,列在下面,记一下. 2. 解决 2.1 使用“Administrator”帐户 前提:当前用户名不是“Ad ...

  3. Centos 5.6安装Mysql(步骤,疑问)

    1.安装步骤 yum install mysql yum install mysql-server yum install mysql-devel chgrp -R mysql /var/lib/my ...

  4. mybatis 一二事(1) - 简单介绍

    mybatis呢是一个orm数据库框架,非常适合新人学,门槛相对较低 本人呢曾经是先做的hibernate,后接触的mybatis,接触mabatis前我比较抵触,为啥呢, 当时喜欢hibernate ...

  5. [self.view addSubview:vc2.view]程序崩溃的解决办法

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. UIButt ...

  6. Java8 新特性简介

    Java8是2014年发布的,至今也已经有快三年的时间了,之前虽然有学习过,但是学的比较零散,不成系统,而且也没有覆盖到Java8所有的特性. 由于公司已经使用了JDK1.8,所以工作中能使用Java ...

  7. zabbix监控某个普通端口

    linux下端口和服务是对应的. 先创建一个模板:configureation-->templates然后点create templates按钮: 如果没有组可以新建个组:app 查看新建的te ...

  8. angular学习笔记(二十七)-$http(5)-使用$http构建RESTful架构

    在angular中有一个特别为RESTful架构而定制的服务,是在$http的基础上进行了封装. 但是为了学习,我们先看看用直接$http是如何构建RESTful架构的: 假设有一个银行卡的列表.需要 ...

  9. jenkins结合脚本实现代码自动化部署及一键回滚至上一版本

    持续集成之⑤:jenkins结合脚本实现代码自动化部署及一键回滚至上一版本 一:本文通过jenkins调用shell脚本的的方式完成从Git服务器获取代码.打包.部署到web服务器.将web服务器从负 ...

  10. Ubuntu 安装谷歌拼音输入法

    Ubuntu14.04内置的拼音输入法有一个bug,使得Live USB全拼无法使用. 安装Google拼音输入法步骤如下: 1. 打开Ubuntu软件中心 (Ubuntu Software Cent ...