时间:2024-07-28
杨建强 李苗在
(鹤壁职业技术学院电子信息工程学院,河南 鹤壁 458030)
基于Java Swing的计算器的设计与实现
杨建强 李苗在
(鹤壁职业技术学院电子信息工程学院,河南 鹤壁 458030)
计算器作为一种计算工具使用率非常高。本文利用Java语言的Swing、动作事件处理机制等技术开发了一个计算器,对于学习Java程序设计具有很大帮助,尤其对于《Java程序设计》课程的教学具有重要的指导作用。
计算器;Swing;Java
计算器作为一种计算工具使用频率非常高,其操作过程也被人们所熟悉。在程序设计语言教学过程中,选取学生所熟悉的场景作为教学案例有利于激发学生的学习兴趣和降低学生的畏惧心理,便于知识点的掌握和项目经验的积累。本文利用Java语言的Swing、动作事件处理机制等技术设计和开发了一个计算器,对于学习Java程序设计具有很大帮助,尤其对于《Java程序设计》课程的教学具有重要的指导作用。
2.1 界面设计
Java程序里GUI(图形用户界面)设计用到的技术有AWT和Swing。其中,AWT是SUN公司推出的最早的一套API,包含的组件种类有限,只能提供基本的GUI设计,无法实现目前GUI设计需要的所有功能,并且开发出来的应用程序在不同的平台上执行时,界面的显示会有所不同。为此,SUN公司对AWT进行了改进,提供了Swing组件,Swing不仅实现了AWT中的所有功能,提供了更加丰富的组件和功能,而且开发出来的应用程序可以在任何平台上运行,不会出现界面显示不同的问题。本设计就是利用Swing技术的相关组件构造了如图1所示的界面。该界面共分为上中下三部分,上面部分是一个JTextField对象,中间部分是在一个设置为FlowLayout布局的JPanel对象上靠右放置两个JButton对象,下面部分是一个设置为4行4列GridLayout布局的JPanel对象上放置16个JButton对象。这三部分分别放置在默认布局为BorderLayout的JFrame对象上的NORTH、CENTER和SOUTH区。
图1 计算器界面
2.2 功能设计
计算器要能够实现以下功能:
1)一个数的输入和显示。
2)输入运算符,输入完算术运算符后,先保存第一个操作数和运算符,为输入第二个操作数做准备。
3)第二个操作数的输入和显示。
4)输入完等号后能够显示运算结果。
5)退格功能的实现,没按一下退格按钮,输入的操作数从低位删除一位。
6)清空功能的实现,上一次运算结束后,点击清空按钮,为下一次运算做准备。
7)计算器的健壮性考虑,比如用户在没输入第一个操作数时就先输入运算符或等号。
8)计算器的友好交互性,比如程序刚启动时和清空后,让文本框内默认显示为“0”。
3.1 Java Swing程序基本代码实现
1)创建Java项目JiSuanQi,在项目里创建一个继承于JFrame并包含main方法的类JiSuanQi.java。
2)在类内定义一个无参的构造函数,里面添加给窗体设置标题、初始位置、自适应窗口大小、窗体大小不可改变和窗体运行可见的代码。代码如下所示:
this.setTitle("计算器");
this.setLocation(100,100);
this.pack();
this.setResizable(false);
this.setVisible(true);
3)在构造函数的最下面设置窗体的关闭方式,代码如下所示:
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
4)在main方法中创建JiSuanQi类的对象,使程序能够正常运行。
3.2 计算器程序的界面实现
1)计算器界面的操作数输入和结果显示文本框代码实现如下所示:
JTextField tField=new JTextField("0",20);
this.add(tField,BorderLayout.NORTH);
2)“退格”和“清空”按钮的实现代码如下所示:
JPanel panel=new JPanel(new FlowLayout(FlowLayout. RIGHT));
JButton tuige=new JButton("退格");
JButton qingong=new JButton("清空");
panel.add(tuige);
panel.add(qingong);
this.add(panel);
3)计算器16个按钮的代码实现是先把按钮上的标识定义成一个字符数组,然后通过循环的方式依次取数组中的每个元素值作为新建JButton对象的文本。这样极大地减少了编程的代码量,也提高了代码的可读性。实现代码如下所示:
JPanel panel2=new JPanel(new GridLayout(4,4,5,5));
String[]bStrings={"7","8","9","+","4","5","6","-","1","2"," 3","*","0",".","=","/"};
for(int i=0;i JButton button3=new JButton(bStrings[i]); panel2.add(button3); } this.add(panel2,BorderLayout.SOUTH); 3.3 计算器功能的实现 在Swing事件模型(如图2所示)中由3个分离的对象完成对事件的处理,分别为事件源、事件和监听器。事件源触发一个事件,它被一个或多个“监听器”接收,监听器负责处理事件。所谓事件监听器,实质上就是一个“实现特定类型监听器接口”的类对象,同时需要将接口中的方法一一实现。最后事件源调用相应的方法加载这个“实现特定类型监听器接口”的类对象,所有的事件源都具有添加或移除相应的事件监听器的方法。计算器功能的实现主要是通过用户点击界面上的相应按钮,触发动作事件,然后由为它添加的动作事件监听器负责处理。计算器是通过匿名内部类来创建事件监听器对象,针对所发生的事件进行处理。程序里需要给每个按钮都添加动作事件监听器,实现代码如下所示:qingong.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvente){ //具体的功能代码实现 } }); 图2 Swing事件模型 计算器程序里所用到的两个操作数的位数是不确定的,需要先定义一个可变的字符串来保存用户输入的数字,还需要定义两个double类型的变量来保存操作数,以及定义一个字符串来保存运算符。该部分代码在整个程序中都要用到,故把这四个变量定义为静态成员变量。代码如下所示: static StringBuffer number=new StringBuffer(); static double number1=0,number2=0; static String flag; 3.3.1 正确使用计算器时的计算功能实现 所谓正确使用计算器是指用户严格按照输入第一操作数、运算符、第二个操作数、等号这样的次序。计算器加减乘除四个功能的实现是一样的,这里我们以乘法为例来介绍一下计算器的功能实现。 第一步,我们需要获取用户按的是哪个按钮,Ac-tionEvent对象的getActionCommand方法可以返回与此动作相关的命令字符串。 第二步,由于我们是把16个按钮通过循环结合button3对象布局到界面上的,所以用户按这16个按钮中的任何一个都将触发绑定到button3上的触发器。在形成第一个操作时我们需要排除4个运算符和等号,然后通过StringBuffer对象的append方法可以实现把多位操作数拼接起来并显示。实现代码如下所示: String aa=e.getActionCommand(); if(!(aa.equals("*")||aa.equals("+")||aa.equals("-")||aa.equals("/ ")||aa.equals("="))) {number.append(aa); tField.setText(number.toString());} 第三步,当用户第一个操作数输入完毕,输入乘法符号时,此时代表用户第一个操作数输入完毕,我们可以先保存第一个操作数和运算符,然后清空number为保存第二个操作数做准备,最后把计算器显示文本框中的内容置空。实现代码如下所示: if(aa.equals("*")){ flag="*"; number1=Double.parseDouble(number.toString()); number.delete(0,number.length()); tField.setText(null); } 第四步,当用户输入第二个操作数时处理方法和第一个操作数一样;待用户输入等号时,说明第二个操作数输入完毕,需要程序根据用户输入的运算符进行计算并把最终结果显示出来,最后清空number为下一次运算做准备。实现代码如下所示: if(aa.equals("=")){ number2=Double.parseDouble(number.toString()); if(flag.equals("*")){ double chengji=number1*number2; String ji=String.valueOf(chengji); tField.setText(ji); number.delete(0,number.length()); } } 3.3.2 不当使用计算器时的处理 用户在使用计算器的过程中难免会出现使用不当的情况,比如,第一个操作数还没输入的时候先输入了运算符或等号,第一个操作数输入完后就输入了等号等等,这类问题的解决方法是一样的。在这我们以用户先输入乘号为例来说明这类问题,出现这种情况程序就会报错,因为此时程序需要保存第一个操作数,而此时number为空,无法转换成double类型的第一个操作数。解决方法为:在用户按下乘号按钮时,我们先判断一下number中是否已保存值,如果有值,继续,如果无值,在显示框中给出提示信息就可以顺利解决了。实现代码如下所示: if(!number.toString().equals("")){ //正常处理代码 } else tField.setText("请先输入第一个操作数!"); 1)清空功能的实现 该功能实现简单,只需要清除number中保存的数就可以了,然后给显示框设置为0,实现代码如下所示: number.delete(0,number.length()); tField.setText("0"); 2)退格功能的实现 退格功能指的是用户在输入操作数的过程中把操作数的最后一位或某几位输入有误,需要删除后重新输入。此时我们还要考虑用户一直按退格按钮会导致全部删完还要删引起的异常处理,所以我们在删除前先判断一下number的长度,只有其长度大于0时才允许删除,提高了系统的健壮性,如果不能删除时,给显示框设置为0,提高了计算器的友好交互性。 if(number.length()>0){ number.deleteCharAt(number.length()-1); tField.setText(number.toString()); }else tField.setText("0"); 计算器的功能虽然与操作系统所带的计算器相比,在功能上有所欠缺,但作为计算器的主体功能已经具备,加上其难易程度适中,综合运用了Java的多个技术,而且便于初学者在理解一种操作运算后,自己去模仿实现其余操作运算,能对初学者起到举一反三和引导的作用。在今后的工作中,将继续完善此计算器程序的功能,使其更有利于初学者掌握Java程序设计。 [1]明日科技.Ja v a从入门到精通(第3版)[M].北京:清华大学出版社,2012. [2]传智博客.Ja v a基础入门[M].北京:清华大学出版社,2014. [3]杨建强.基于.NET的高职实验报告管理信息系统的设计与实现[J].电脑开发与应用,2013(9):51-53. The Design and Realization of Logistics Management System Based on C#.net Xia Binhao Lou Yishu Zhang Yiqiong With the high-speed development of computer network,computer has played a vital role in each domain of the society.The logistics management system based on C#.net makes the requirements of logistics management more systematic and more standardized.This system not only reduces company's operation cost,but also raises the working efficiency greatly. C#.net;logistics management system;systematic;standardization TP311.11 A 1008-6609(2016)10-0061-03 杨建强(19 78-),男,河南滑县人,硕士,副教授,研究方向为软件开发、软件工程。4 结束语
(Yuncheng University,Yuncheng 044000,Shanxi)
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!