一、任务目标学会分析“简易计算器”任务的实现思路
根据思路独立完成“简易计算器”的源代码编写、编译和运行
掌握正则表达式来判定数字键或者数据是否合法
掌握String类常用方法的使用,如:contains方法等
掌握Java异常处理机制
熟练掌握Swing包(JTextField控件、JButton控件和控件数组)的使用,以及常用布局方式的使用
掌握GUI开发过程中如何处理组件上发生的界面事件
二、实现思路
2.1 界面布局实现思路根据实验要求,利用GridBagLayout布局将每个组件放在合适的位置,利用GridBagConstraints类中的Insets方法实现组件间隔
利用数组存放每个组件显示的文本
2.2 事件处理实现思路
设计ComputerListener接口继承按钮触发事件ActionListener接口以增加其抽象方法实现将界面事件传至PoliceListen类(PoliceListen类实现接口ComputerListener)做事件处理。
2.3 计算功能实现思路输入合法机制
避免第一位为符号,设置判断当第一位按非数字使不处理
当第一位为零,第二位也为零,设置判断当第一位为零时输入数字无效
避免首位为零,其后出现多个零(即0001),判断该输入的倒数第二位是否为符号,倒数第一位是否为0,在对按钮0。是则不做处理
避免输出数字不合法(多个小数点 即6.6.6),利用循环以符号位为分割线,判该数字是否存在已存在小数点,即每个运算符号后的数字至多存在一个小数点
排除多符号一起串连(即8+*9+6*/5),点击运算符触发事件并判断前一位是否为符号,是则不做处理
计算字符串
判断最后一位是否为运算符,利用String类中的charAt()方法提取最后一位进行判断,是则提示错误,否则运算
字符和数字分离,两次利用StringTokenizer类进行字符串提取分析分别得到数字序列和运算符序列
将数字序列和运算符序列存放在两个链表中,链表的删除较为便利
根据优先级计算,设置两个循环(当符号链表中的数据不为空则继续),第一个循环计算所有得乘除,即符号前后得两个数乘除,结果放在第一个数中删除第一个数和删除符号;第二个循环计算所有的加减,结果放在第一个数中删除第一个数和删除符号
三、实现代码及运行结果
UML图
实现代码
运行结果
四、总结或感悟
4.1 错误分析输入一个数中多个小数点
分析器的StringTokenizer的是否错误
正则表达式的使用错误
4.2 错误解决以运算符为分割,运算符后的数字之多只有一个小数点
在分析器使用分析字符串中的标点符号时未排除”0”,最后在单步调试中发现错误
“[+-*/]” 该正则表达式可以匹配”.”,导致浪费大量的时间检查在”.”的触发事件上
4.3 总结感悟
通过本次实验学习到了以下几点:
该开始入手实验时无从下手,一边考虑如何布局,一边考虑如何输出合法,一边考虑如何实现计算,一心三用,没有主次先后的编程观念。浪费比较多的时间;而后有了步骤,先将组件间的布局做好,在考虑输入数据的合法,最后在合法的情况下实现计算
学习到了一种新的布局方式GridBagLayout布局,该布局也是一种类似网格布局,改进GridLayout布局不能改变组件在网格中的大小的,组件间的间隔问题
本次实验未使用 WindowBuilding插件,主要的原因时想检验以下自己在暑假看课本的成果,以及个人认为在使用插件时容易将代码弄乱。不过在布局方面花费比较多的时间。但也熟悉了几个布局的特点,以及他们的常用方法
本次实验最大的收获就是熟悉掌握了一个类中实例的对象在利用构造方 法在各个类中的重复使用,以及复习接口的相关知识
五、代码附录
Text.java
ComputerListener.java
Win.java
PoliceListen.java