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

  1. package Com.SwingTest;
  2.  
  3. import java.awt.*;
  4. import java.awt.event.*;
  5.  
  6. public class SwingText_13
  7. {
  8. public static void main(String[] args)
  9. {
  10. new Calculate().launch();
  11. }
  12. }
  13.  
  14. class Calculate extends Frame
  15. {
  16. private boolean firstFlag = true;
  17. private String str1 = "";
  18. private String str2 = "";
  19. private TextField tf = null;
  20. private String strOper = null; //20行 strOper用来记录到底是+还是-还是*还是/操作,因为我们点击"="按钮时是无法通过该事件得到上次我们执行的到底是+还是-还是*还是/操作,所以我们需要定义一个属性strOper来记录单击"="之前的上次执行的操作
  21.  
  22. public void launch()
  23. {
  24. Frame f = new Frame();
  25. f.setTitle("简单实现的计算器");
  26. tf = new TextField(30);
  27. tf.setBackground(Color.WHITE);
  28. //setLayout(new BorderLayout()); //Frame默认的布局管理器就是BorderLayout
  29. f.add(tf, BorderLayout.NORTH);
  30. Panel p = new Panel(new GridLayout(4, 4, 5, 5));
  31. for (int i=0; i<10; ++i)
  32. {
  33. Button bn = new Button("" + i);
  34. bn.setActionCommand("数字");
  35. p.add(bn);
  36. bn.addActionListener(new MyMonitor());
  37. }
  38.  
  39. Button bnAdd = new Button("+");
  40. p.add(bnAdd);
  41. bnAdd.setActionCommand("算术操作");
  42. bnAdd.addActionListener(new MyMonitor());
  43.  
  44. Button bnSub = new Button("-");
  45. p.add(bnSub);
  46. bnSub.setActionCommand("算术操作");
  47. bnSub.addActionListener(new MyMonitor());
  48.  
  49. Button bnMult = new Button("*");
  50. bnMult.addActionListener(new MyMonitor());
  51. p.add(bnMult);
  52. bnMult.setActionCommand("算术操作");
  53.  
  54. Button bnDiv = new Button("/");
  55. p.add(bnDiv);
  56. bnDiv.setActionCommand("算术操作");
  57. bnDiv.addActionListener(new MyMonitor());
  58.  
  59. Button bnEq = new Button("=");
  60. p.add(bnEq);
  61. bnEq.setActionCommand("=");
  62. bnEq.addActionListener(new MyMonitor());
  63.  
  64. Button bnClear = new Button("清零");
  65. p.add(bnClear);
  66. bnClear.setActionCommand("清零");
  67. bnClear.addActionListener(new MyMonitor());
  68.  
  69. p.add(bnAdd);
  70. p.add(bnSub);
  71. p.add(bnMult);
  72. p.add(bnDiv);
  73. p.add(bnEq);
  74. p.add(bnClear);
  75.  
  76. f.add(p, BorderLayout.CENTER);
  77. f.setBounds(200, 200,300, 300);
  78. f.setBackground(Color.CYAN);
  79. f.setVisible(true);
  80. f.addWindowListener( new WindowAdapter()
  81. {
  82. @Override
  83. public void windowClosing(WindowEvent e)
  84. {
  85. System.exit(-1);
  86. }
  87. }
  88. );
  89. }
  90.  
  91. //内部类
  92. class MyMonitor implements ActionListener
  93. {
  94. public void actionPerformed(ActionEvent e)
  95. {
  96. //如果是对=按钮的点击操作,则我们需要得到上次动作命令名称的信息,因为本次事件中只能得到按钮标签的信息= 和 按钮动作命令名称=, 无法得到上次执行的到底是+还是-还是*还是/操作,所以我们需要单独定义一个属性用来记录动作命令名称的信息,参见20行代码
  97. /*actionPerformed()方法算法如下:
  98. 第一: 我们必须先得通过e得到按钮的动作命令名称strAc和按钮标签字符串的
  99. 信息strLab
  100. 第二: 然后通过判断按钮的动作命令名称strAc来执行不同的操作,即:
  101. 如果strAc是"数字",即如果是对0-9按钮的单击操作, 则更新str1 或者 str2的值
  102. 如果strAc是"算术操作",即如果是对"+" "-" "*" "/"按钮的单击操作,则我们必须得把按钮标签字符窜strLb的值赋给属性strOper, 注意不能把strAc赋给strOper, 因为此时strAc的值是"算术操作"
  103. 如果strAc是"=", 则。。。。。。略
  104. 如果strAc是"清零",则。。。。。。略
  105.  
  106. */
  107.  
  108. String strAc = e.getActionCommand();
  109. Button bn = (Button)e.getSource();
  110. String strLb = bn.getLabel();
  111.  
  112. if (strAc.equals("数字"))
  113. {
  114. if (firstFlag)
  115. {
  116. str1 = str1 + strLb; //
  117. tf.setText(str1);
  118. }
  119. else
  120. {
  121. str2 = str2 + strLb; //
  122. tf.setText(str2);
  123. }
  124. }
  125. else if (strAc.equals("算术操作")) //如果是+ - * / 操作
  126. {
  127. strOper = strLb; //118 千万不要写成了 strOper = strAc; 因为本语句要被执行的话,此时strAc的值一定是"算术操作", 我们需要的是+ - * / 即我们需要的是按钮标签字符窜的信息
  128. firstFlag = false;
  129. }
  130. else if (strAc.equals("="))
  131. {
  132. result();
  133. }
  134. else if (strAc.equals("清零"))
  135. {
  136. str1 = str2 = "";
  137. tf.setText("");
  138. firstFlag = true;
  139. }
  140. }
  141. }
  142.  
  143. public void result()
  144. {
  145. double num1 = Double.parseDouble(str1);
  146. double num2 = Double.parseDouble(str2);
  147. double num3 = 0;
  148.  
  149. if (strOper.equals("+"))
  150. {
  151. num3 = num1 + num2;
  152. }
  153. else if (strOper.equals("-"))
  154. {
  155. num3 = num1 - num2;
  156. }
  157. else if (strOper.equals("*"))
  158. {
  159. num3 = num1 * num2;
  160. }
  161. else if (strOper.equals("/"))
  162. {
  163. num3 = num1 / num2;
  164. }
  165.  
  166. tf.setText("" + num3);
  167. str1 = String.valueOf(num3); //不能写成了 str1 = str2;
  168. str2 = "";
  169. //firstFlag = false; //本行代码可以省略
  170. }
  171. }

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. print to console or file

    /*----------------------------------------------------------------------*/ /*              Debug for ...

  2. Cocos2d-X开发中国象棋《二》project文件概述

    我在上一篇博客中介绍了象棋的功能.在接下来的博客中将向大家介绍使用Cocos2d-X怎样一步一步开发中国象棋 开发工具: Cocos2d-X2.2.3 VS2012 项目的文件夹: Classes:存 ...

  3. ps换衣服

    1.抠衣服->给衣服新建图层(ctrl+j)->给图层去色,让衣服边黑白色.2.剪贴蒙版(上图:大花布,下形:衣服).作用:大花布替换成衣服3.大花布图层->叠加图层样式或其它图层样 ...

  4. xpages的combobox提前输入值

            之前的文档已经提到怎么在combobx手动输入.哪我们如何能够在combobox默认获取值呢?下面有几个种方法请大家參考 1)获取当前数据库某视图的某列值 @DbColumn(&quo ...

  5. iptables的自定义链--子链

    我个人理解:子链的作用就是为了减少重复设置,有的时候可能对数据包进行一系列的处理,而且还被多种规则引用.这样就可以设置成子链,一起跳转过去处理. -j subchain 子链用-N来创建. iptab ...

  6. Linux C语言小程序

    Linux C语言小程序 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include & ...

  7. [svc]Iaas Paas Saas区别

    https://www.zhihu.com/question/20387284

  8. 错误 1 error LNK2019: 无法解析的外部符号 "public: __thiscall Distance::Distance(int)" (??0Distance@@QAE@H@Z),该符号在函数 _main 中被引用

    错误: 错误 1 error LNK2019: 无法解析的外部符号 "public: __thiscall Distance::Distance(int)" (??0Distanc ...

  9. 【DSP】CCS中.dat文件的格式

    转自“http://e2e.ti.com/support/development_tools/code_composer_studio/f/81/t/168292” Here is the infor ...

  10. 将Java项目从maven迁移到gradle

    将Java项目从maven迁移到gradle 如何将一个java项目从maven迁移到gradle呢?gradle集成了一个很方便的插件:Build Init Plugin,使用这个插件可以很方便地创 ...