赞
踩
1.C是清除键,功能是将之前所输入的数字、计算结果等信息全部归零
2.CE,清除当前输入的数据或符号
3.单击MS存储当前显示值,可以理解为放到存储区
4.单击MC清除存储区数值
5.单击MR将存储区数据显示到屏幕上
6.M+:当前显示的数与存储区的数相加
7.M-:当前显示的数与存储区的数相减
首先对于图形显示上,底层容器采用边界布局在边界的北方和中间分别加入了两个面板。一个采用流式布局的面板添加了一个文本框,一个采用了6*5网格布局的面板添加了很多按钮。
具体实现上,对于按钮,我分成了num数字键和function功能键。创建对象时,这块代码太过冗长便把这一部分整体写成一个surface()函数。函数实现了文本框、按钮、面板的创建,菜单条的创建,同时将文本框、按钮都添加到面板中,菜单添加到菜单条中等。另外,设置了一个str字符串数组,实现存储两个操作数、操作符、暂时存储计算结果、寄存器。设置了一个布尔类型变量标志第一个数是否存在。register()函数实现对文本框、按钮注册监视器。
整体代码思想使用了getActionCommand()函数读取命令。再通过字符串函数equal()函数判断是什么符号,之后对不同符号采取不同的操作。以加法为例,通过equal函数进入到加法的分支语句,首先读取文本框内容作为第一个操作数,将字符串存入str[0],再将操作符加号存入str[1],将标志位flag1设置成true,表示存在第一个数据。文本框清空,输入第二个数据,单击“=”按钮。进入等于的分支语句,“=”按钮中对操作码进行了讨论,若为单目运算(百分数、开根号等),一个操作数即可运算;若为双目运算,需要先读取文本框的内容作为第二个操作数,存入str[2],若第一个操作数存在,两个操作数做操作码的运算,将结果存入str[4]。若第一个数据不存在,文本框输出“错误输入!”
- package sohu;
- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- public class calculate extends JFrame implements ActionListener{
- JPanel jp1,jp2;//两个面板,一个放文本框,一个放按钮
- JButton num[],function[];//数字键num,功能键function
- JTextField jtf1;//文本框
- JMenuBar jm;//菜单条
- JMenu jmi1,jmi2,jmi3;//菜单
- private String[] str={"","","","","",""};
- //str[0]:第一个数 str[1]:运算符 str[2]:第二个数
- //str[3]:MS str[4]:缓存存入MS的数
- private boolean flag1=false;//是否写入第一个数
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- calculate win=new calculate();
- }
- void surface(){//计算器界面
- num=new JButton [10];//数字键
- for(int i=0;i<num.length;i++){
- num[i]=new JButton(""+i);
- num[i].setFont(new Font("黑体", Font.BOLD, 30));
- }
- function=new JButton [18];//功能键
- function[0]=new JButton("MC");//清除存储区中的数值
- function[0].setFont(new Font("黑体", Font.BOLD, 30));
- function[1]=new JButton("MR");//将存储区的数显示到显示栏中
- function[1].setFont(new Font("黑体", Font.BOLD, 30));
- function[2]=new JButton("MS");//存储当前显示的值
- function[2].setFont(new Font("黑体", Font.BOLD, 30));
- function[3]=new JButton("M+");//当前显示的数与存储区的数相加
- function[3].setFont(new Font("黑体", Font.BOLD, 30));
- function[4]=new JButton("M-");//当前显示的数与存储区的数相减
- function[4].setFont(new Font("黑体", Font.BOLD, 30));
- function[5]=new JButton("←");//删除
- function[5].setFont(new Font("黑体", Font.BOLD, 30));
- function[6]=new JButton("CE");//清除当前输入的数据或符号 存储区内容不变
- function[6].setFont(new Font("黑体", Font.BOLD, 30));
- function[7]=new JButton("C");//将之前输入
- function[7].setFont(new Font("黑体", Font.BOLD, 30));
- function[8]=new JButton("±");//同时输出加和减
- function[8].setFont(new Font("黑体", Font.BOLD, 30));
- function[9]=new JButton("√");//求平方根
- function[9].setFont(new Font("黑体", Font.BOLD, 30));
- function[10]=new JButton("/");//除
- function[10].setFont(new Font("黑体", Font.BOLD, 30));
- function[11]=new JButton("%");//百分数
- function[11].setFont(new Font("黑体", Font.BOLD, 30));
- function[12]=new JButton("*");//乘
- function[12].setFont(new Font("黑体", Font.BOLD, 30));
- function[13]=new JButton("1/x");//取倒数
- function[13].setFont(new Font("黑体", Font.BOLD, 30));
- function[14]=new JButton("-");//减
- function[14].setFont(new Font("黑体", Font.BOLD, 30));
- function[15]=new JButton("+");//加
- function[15].setFont(new Font("黑体", Font.BOLD, 30));
- function[16]=new JButton(".");//小数点
- function[16].setFont(new Font("黑体", Font.BOLD, 30));
- function[17]=new JButton("=");//等于
- function[17].setFont(new Font("黑体", Font.BOLD, 30));
- jp1=new JPanel();
- jp2=new JPanel();
- jtf1=new JTextField(30);//文本框
- jtf1.setFont(new Font("黑体", Font.BOLD, 30));
- this.setLayout(new BorderLayout());//底层容器采用边界布局
- jp1.setLayout(new FlowLayout());//存放文本框的面板采用流布局
- jp1.add(jtf1);//文本框
- jp2.setLayout(new GridLayout(6,5));//存放按钮的面板采用网格布局6*5
- //向面板中添加按钮
- for(int i=0;i<10;i++){
- jp2.add(function[i]);
- }
- jp2.add(num[7]);
- jp2.add(num[8]);
- jp2.add(num[9]);
- jp2.add(function[10]);//除
- jp2.add(function[11]);//百分数
- jp2.add(num[4]);
- jp2.add(num[5]);
- jp2.add(num[6]);
- jp2.add(function[12]);//乘
- jp2.add(function[13]);//取倒数
- jp2.add(num[1]);
- jp2.add(num[2]);
- jp2.add(num[3]);
- jp2.add(function[14]);//减
- jp2.add(new JButton());//空
- jp2.add(num[0]);
- jp2.add(new JButton());//空
- jp2.add(function[16]);//小数点
- jp2.add(function[15]);//加
- jp2.add(function[17]);//等于
- //设置菜单条
- jm=new JMenuBar();
- jmi1=new JMenu ("查看(V)");
- jmi2=new JMenu ("编辑(E)");
- jmi3=new JMenu ("帮助(H)");
- //向菜单条中添加菜单
- jm.add(jmi1);
- jm.add(jmi2);
- jm.add(jmi3);
- this.setJMenuBar(jm);//将菜单条加到容器中
- this.add(jp1,BorderLayout.NORTH);//添加文本框面板
- this.add(jp2,BorderLayout.CENTER);//添加按钮面板
- }
- void register(){//注册监视器
- for(int i=0;i<num.length;i++){
- num[i].addActionListener(this);
- }
- for(int i=0;i<function.length;i++){
- function[i].addActionListener(this);
- }
- jtf1.addActionListener(this);
- }
- calculate(){
- surface();//外观设置
- register();//注册监视器
- //基本属性设置
- this.setTitle("计算器");
- this.setSize(600,600);
- this.setLocation(300,300);
- this.setVisible(true);
- this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- }
- @Override
- public void actionPerformed(ActionEvent e) {
- // TODO Auto-generated method stub
- String ss=e.getActionCommand();//读命令
- //判断命令
- if(ss.equals("MC")){
- str[3]="0";
- }
- else if(ss.equals("MR")){
- jtf1.setText("");//文本框清空
- jtf1.setText(str[3]);//将缓冲区数值输出到文本框中
- }
- else if(ss.equals("MS")){
- str[3]=jtf1.getText();//将暂缓的str[4]存到寄存器中
- }
- else if(ss.equals("M+")){//数据与str[3]做加法
- double a=Double.parseDouble(str[3]);
- str[4]=jtf1.getText();
- double b=Double.parseDouble(str[4]);
- str[3]=""+(a+b);//将结果转为字符串,存入str[3]
- str[4]=str[3];
- jtf1.setText("");
- jtf1.setText(str[3]);
- }
- else if(ss.equals("M-")){//数据与str[3]做减法
- double a=Double.parseDouble(str[3]);
- str[4]=jtf1.getText();
- double b=Double.parseDouble(str[4]);
- str[3]=""+(b-a);//将结果转为字符串,存入str[3]
- str[4]=str[3];
- jtf1.setText("");
- jtf1.setText(str[3]);
- }
- else if(ss.equals("←")){//删除当先数据的一位
- str[4]=jtf1.getText();
- if(str[4].length()==0)
- jtf1.setText("");
- else{
- str[4]=str[4].substring(0,str[4].length()-1);
- jtf1.setText(str[4]);
- }
- }
- else if(ss.equals("CE")){//清空当前输入文本框内容
- jtf1.setText("");
- }
- else if(ss.equals("C")){
- str[0]=str[1]=str[2]=str[4]="";//清空所有数据和符号
- jtf1.setText("");
- }
- else if(ss.equals("±")){//同时计算加法和减法
- str[0]=jtf1.getText();
- if(str[0].length()==0) {
- jtf1.setText("错误输入!");
- }
- else{
- str[1]="±";
- flag1=true;
- jtf1.setText("");
- }
- }
- else if(ss.equals("√")){//开根号
- str[1]="√";
- }
- else if(ss.equals("/")){//除法
- str[0]=jtf1.getText();
- if(str[0].length()==0) {
- jtf1.setText("错误输入!");
- }
- else{
- str[1]="/";
- flag1=true;
- jtf1.setText("");
- }
- }
- else if(ss.equals("%")){//求百分数
- str[0]=jtf1.getText();
- if(str[0].length()==0) {
- jtf1.setText("错误输入!");
- }
- else{
- str[1]="%";
- flag1=true;
- jtf1.setText("");
- }
- }
- else if(ss.equals("*")){//乘法
- str[0]=jtf1.getText();
- if(str[0].length()==0)
- jtf1.setText("错误输入!");
- else{
- str[1]="*";
- flag1=true;
- jtf1.setText("");
- }
- }
- else if(ss.equals("1/x")){//除法
- str[0]=jtf1.getText();
- double a=Double.parseDouble(str[0]);
- if(a==0)
- jtf1.setText("0不能做除数");
- else{
- jtf1.setText(""+1/a);
- }
- }
- else if(ss.equals("-")){//减法
- str[0]=jtf1.getText();
- if(str[0].length()==0)
- jtf1.setText("错误输入!");
- else{
- str[1]="-";
- flag1=true;
- jtf1.setText("");
- }
- }
- else if(ss.equals("+")){//加法
- str[0]=jtf1.getText();
- if(str[0].length()==0)
- jtf1.setText("错误输入!");
- else{
- str[1]="+";
- flag1=true;
- jtf1.setText("");
- }
- }
- else if(ss.equals("=")){//输出最后结果
- //单目运算
- if(str[1]=="√"){
- str[0]=jtf1.getText();
- double a=Double.parseDouble(str[0]);
- if(a<0) {
- jtf1.setText("错误输入!");
- }
- else
- jtf1.setText(""+Math.sqrt(a));
- }
- else if(str[1].equals("1/x")){
- str[0]=jtf1.getText();
- double a=Double.parseDouble(str[0]);
- if(a==0)
- jtf1.setText("0不能做除数");
- else{
- jtf1.setText(""+1/a);
- }
- }
- else if(str[1].equals("%")){
- if(flag1){
- double a=Double.parseDouble(str[0]);
- a*=0.01;
- str[4]=str[0];
- jtf1.setText(""+a);
- }
- else
- jtf1.setText("错误输入");
- }
- //双目运算
- else if(str[1].equals("+")){
- str[2]=jtf1.getText();
- if(flag1==true){//第一个数据是否存在
- double a=Double.parseDouble(str[0]);
- double b=Double.parseDouble(str[2]);
- str[4]=""+(a+b);//暂时保留结果
- jtf1.setText(str[4]);
- }
- else{
- jtf1.setText("错误输入!");
- }
- }
- else if(str[1].equals("-")){
- str[2]=jtf1.getText();
- if(flag1==true){//第一个数据是否存在
- double a=Double.parseDouble(str[0]);
- double b=Double.parseDouble(str[2]);
- str[4]=""+(a-b);//暂时保留结果
- jtf1.setText(str[4]);
- }
- else{
- jtf1.setText("错误输入!");
- }
- }
- else if(str[1].equals("*")){
- str[2]=jtf1.getText();
- if(flag1==true){//第一个数据是否存在
- double a=Double.parseDouble(str[0]);
- double b=Double.parseDouble(str[2]);
- str[4]=""+(a*b);//暂时保留结果
- jtf1.setText(str[4]);
- }
- else{
- jtf1.setText("错误输入!");
- }
- }
- else if(str[1].equals("/")){
- str[2]=jtf1.getText();
- if(flag1==true){//第一个数据是否存在
- double a=Double.parseDouble(str[0]);
- double b=Double.parseDouble(str[2]);
- if(b==0){//0不可以作为除数
- jtf1.setText("0不能作为除数");
- }
- else{
- str[4]=""+(a/b);//暂时保留结果
- jtf1.setText(str[4]);
- }
- }
- else{
- jtf1.setText("错误输入!");
- }
- }
- else if(str[1].equals("±")){//同时输出加法和减法
- str[2]=jtf1.getText();
- if(flag1==true){//第一个数据是否存在
- double a=Double.parseDouble(str[0]);
- double b=Double.parseDouble(str[2]);
- str[4]=""+(a+b)+"&"+(a-b);//暂时保留结果,将结果存入str[3]无意义
- jtf1.setText(str[4]);
- flag1=false;
- }
- else{
- jtf1.setText("错误输入!");
- }
- }
- }
- //在文本框显示数字
- else if(ss.equals("0")){
- jtf1.setText(jtf1.getText()+"0");
- }
- else if(ss.equals("1")){
- jtf1.setText(jtf1.getText()+"1");
- }
- else if(ss.equals("2")){
- jtf1.setText(jtf1.getText()+"2");
- }
- else if(ss.equals("3")){
- jtf1.setText(jtf1.getText()+"3");
- }
- else if(ss.equals("4")){
- jtf1.setText(jtf1.getText()+"4");
- }
- else if(ss.equals("5")){
- jtf1.setText(jtf1.getText()+"5");
- }
- else if(ss.equals("6")){
- jtf1.setText(jtf1.getText()+"6");
- }
- else if(ss.equals("7")){
- jtf1.setText(jtf1.getText()+"7");
- }
- else if(ss.equals("8")){
- jtf1.setText(jtf1.getText()+"8");
- }
- else if(ss.equals("9")){
- jtf1.setText(jtf1.getText()+"9");
- }
- }
- }
整体界面:
开根号:
加减法:
2±3
MS将5263存入寄存器,MR显示出来
25与寄存器中的520相加
“<-”
52的百分数
其余功能不在这一一展示了。
代码仍存在很多问题,例如小数点没有实现,显示“错误输入!”后如果想要重新输入数据必须先单击一下“CE”按钮或“C”按钮,不然数据会跟到“错误输入!”字符串后面,会影响之后的功能。单击清除之后不会有问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。