java普通计算器_第1页
java普通计算器_第2页
java普通计算器_第3页
java普通计算器_第4页
java普通计算器_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基本思想:建立窗口时,我后面才想到把所有的组件先放到Container容器中。我先把计算器分解成,菜单栏,输入区,按钮区,分别对三个函数实现相应的操作,最后在计算器构造函数调用绑定到窗口。我创建了计算符操作按钮、非计算操作按钮、菜单监听器,三个监听器来实现菜单和按钮监听。对于各组件我采用GridBagLayout可变布局,再GridBagConstraints对布局组件布局设置。JTextField输入区全局定义为了方便按钮的输入。创建一个按钮函数,有利于添加的按钮布局设置以及根据不同类型的按钮添加不同的监听器。因为计算器有整数和小数计算的区别,我创建一个数值类根据不同的值,计算后返回不同的类型,在类内部实现数值的计算操作。最后单独一个函数来实现计算操作。import java.awt.Container;import java.awt.Font;import java.awt.GridBagConstraints;import java.awt.GridBagLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JTextField;public class Caculat extends JFrameprivate GridBagLayout layout=new GridBagLayout();/可变布局private GridBagConstraints constraints=new GridBagConstraints();/布局设置private Container container=new Container();/容器,用于储存组件,最后一起添加到窗口JTextField textField=new JTextField();/输入区int fpoint=0;/textField 光标定位String last=“0“;/存储最后输入的数字String copty=“;/编辑时使用Numer result=new Numer();/结果暂存Numer num=new Numer();/输入暂存private String lastCommand=“=“;/保存+,-,*,/,=命令Numer M;/结果存储器boolean upfirst=true;/判断是否首次使用向上private boolean start=false;/判断是否为数字的开始private boolean setoperator=false;/判断是否使用计算符private boolean den=false;/判断是否刚刚使用等号public Caculat()super(“计算器“);container.setLayout(layout);addMenu();addTextField();addButton();add(container);/添加菜单private void addMenu()JMenu menus=new JMenu3;/主菜单menus0=new JMenu(“查看(V)“);menus0.setMnemonic(F);menus1=new JMenu(“编辑(E)“);menus1.setMnemonic(E);menus2=new JMenu(“帮助(H)“);menus2.setMnemonic(H);JMenuItem lookItem=new JMenuItem2;/子菜单JMenuItem aditItem=new JMenuItem3;JMenuItem helpItem=new JMenuItem2;lookItem0=new JMenuItem(“普通型(O)“);lookItem0.setMnemonic(O);/快捷键lookItem1=new JMenuItem(“标准型(T)“);lookItem1.setMnemonic(T);aditItem0=new JMenuItem(“复制(C) Ctrl+C“);/这个不会,只知道Alt+CaditItem0.setMnemonic(C);aditItem1=new JMenuItem(“粘贴(P) Ctrl+V“);aditItem1.setMnemonic(P);aditItem2=new JMenuItem(“自由编辑(F)“);aditItem2.setMnemonic(F);helpItem0=new JMenuItem(“关于主题(H)“);helpItem0.setMnemonic(H);helpItem1=new JMenuItem(“关于计算器(A)“);MenuAction menuaction=new MenuAction();/菜单监听器lookItem0.addActionListener(menuaction);lookItem1.addActionListener(menuaction);aditItem0.addActionListener(menuaction);aditItem1.addActionListener(menuaction);aditItem2.addActionListener(menuaction);helpItem0.addActionListener(menuaction);helpItem1.addActionListener(menuaction);JMenuBar bar=new JMenuBar();/菜单容器吧menus0.add(lookItem0);menus0.add(lookItem1);menus1.add(aditItem0);menus1.add(aditItem1);menus1.add(aditItem2);menus2.add(helpItem0);menus2.add(helpItem1);setJMenuBar(bar);/把菜单绑到窗口上的方法bar.add(menus0);bar.add(menus1);bar.add(menus2);/添加输入区private void addTextField()constraints.gridx=0;/组件x 位置constraints.gridy=1;/组件y 位置constraints.gridheight=1;/组件高度constraints.gridwidth=5;/组件宽度constraints.fill=GridBagConstraints.BOTH;/组件随显示变化的选项constraints.weightx=1;/水平扩展,即显示变化时,长度变化constraints.weighty=1;/垂直扩展,即高度变化textField.setHorizontalAlignment(JTextField.RIGHT);/光标右边显示textField.setEditable(false);/不可编辑textField.setFont(new Font(“Serif“,Font.PLAIN,18);/显示字体layout.setConstraints(textField, constraints);/把布局设置应用到组件上container.add(textField);/把该组件添加到容器中/添加按钮区private void addButton()InsertAction insert=new InsertAction();CommandAction command=new CommandAction();addbutton(“MC“,0,2,1,1,command);addbutton(“MR“,1,2,1,1,command);addbutton(“MS“,2,2,1,1,command);addbutton(“M+“,3,2,1,1,command);addbutton(“M-“,4,2,1,1,command);addbutton(“Delete“,0,3,1,1,insert);addbutton(“CE“,1,3,1,1,insert);addbutton(“C“,2,3,1,1,insert);addbutton(“,3,3,1,1,insert);addbutton(“,4,3,1,1,command);addbutton(“7“,0,4,1,1,insert);addbutton(“8“,1,4,1,1,insert);addbutton(“9“,2,4,1,1,insert);addbutton(“,3,4,1,1,command);addbutton(“%“,4,4,1,1,command);addbutton(“4“,0,5,1,1,insert);addbutton(“5“,1,5,1,1,insert);addbutton(“6“,2,5,1,1,insert);addbutton(“,3,5,1,1,command);addbutton(“1/x“,4,5,1,1,command);addbutton(“1“,0,6,1,1,insert);addbutton(“2“,1,6,1,1,insert);addbutton(“3“,2,6,1,1,insert);addbutton(“ ,3,6,1,1,command);addbutton(“,4,6,1,1,command);addbutton(“0“,0,7,1,1,insert);addbutton(“.“,1,7,1,1,insert);addbutton(“=“,4,7,1,1,command);addbutton(“,2,7,1,1,command);addbutton(“,3,7,1,1,command);/单个按钮设置private void addbutton(String label,int x,int y,int height,int width,ActionListener listener)JButton button=new JButton(label);constraints.gridx=x;constraints.gridy=y;constraints.gridheight=height;constraints.gridwidth=width;constraints.fill=GridBagConstraints.BOTH;button.addActionListener(listener);layout.setConstraints(button,constraints);container.add(button);/container./非计算符监听器。主要是非计算操作的按钮private class InsertAction implements ActionListenerpublic void actionPerformed(ActionEvent event)String input=event.getActionCommand();/获取输入的按钮String output=textField.getText();/获取输入区内容/不再使用等号。主要是刷新输入if(den)lastCommand=“=“;den=false;/输入区的删除if(input.equals(“Delete“)if(fpoint0)textField.setText(output.substring(0,fpoint-1)+output.substring(fpoint,output.length();if(fpoint0)fpoint-;/光标位置减一return;/删除前一次计算的结果if(fpoint=output.length()output=textField.getText();fpoint=output.length();setoperator=false;if(input.equals(“.“)/防止重复输入“.“if(output.indexOf(“.“)=-1)/在输入区中间插入if(fpoint0)textField.setText(output.substring(0, fpoint)+input+output.substring(fpoint,output.length() );fpoint+;output=textField.getText();else if(fpoint=output.length()/输入区尾部插入if(output.length()=0)textField.setText(“0.“);/空输入时加“0.“else textField.setText(output+“.“);output=textField.getText();fpoint=output.length();start=true;return;/键入数字if(!input.equals(“)fpoint=input.length(); start=true;return;/在中间插入数字if(fpoint0)fpoint-;textField.setText(output.substring(0,fpoint)+“ +output.substring(fpoint,output.length();return;if(input.equals(“)if(!output.equals(“)if(fpointoutput.length()fpoint+;if(fpointoutput.length()textField.setText(output.substring(0,fpoint)+“ +output.substring(fpoint,output.length();return;/单操作符需要对初始lastCommand刷新if(input.equals(“1/x“)|input.equals(“)lastCommand=input;if(input.equals(“=“)/第一次使用等号需要更新,以后重复使用,就不断重复最后一次运算if(!den)last=output;num.rnumber(last);if(lastCommand.equals(“)|lastCommand.equals(“1/x“)/单操作符需要不断更新最后值last=output;num.rnumber(last);calculate(num);/计算start=false;/不是数字结束setoperator=true;/使用了计算符den=true;return;/使用等号if(den)/结束使用等号lastCommand=“=“;den=false;if(start)/防止重复输入操作符时,把结果当作输入进行计算last=output;num.rnumber(last);calculate(num);lastCommand=input;else lastCommand=input;/重复输入操作符时,不断刷新,但不计算start=false;setoperator=true;/菜单监听器private class MenuAction implements ActionListenerpublic void actionPerformed(ActionEvent event)String input=event.getActionCommand();if(input.equals(“关于主题(H)“)JOptionPane.showMessageDialog(Caculat.this,String.format(“%s“, “花了快半个月了。n“+“ -许先斌n“ +“ 2011.8.12“);return;if(input.equals(“关于计算器(A)“)JOptionPane.showMessageDialog(Caculat.this,String.format(“%s“, “该计算器最多存储100条记录。n“ +“计算器需要确保输入正确,否则得不到答案。n“+“计算器上的计算符号与键盘的不一样,最好不要由键盘输入。“);return;if(input.equals(“复制(C) Ctrl+C“)copty=textField.getText();JOptionPane.showMessageDialog(Caculat.this,String.format(“复制%s“, “);return;if(input.equals(“粘贴(P) Ctrl+V“)textField.setText(textField.getText().substring(0, fpoint)+copty+textField.getText().substring(fpoint);JOptionPane.showMessageDialog(Caculat.this,String.format(“%s“, “粘贴成功!“);return;if(input.equals(“自由编辑(F)“)textField.setEditable(true);/数值类。因为输入的数值类型不明确。我用double和int交替存储.不为零的是数值,或者用bool 判断public class Numerdouble d=0;int n=0;boolean is_int=true;/说明数值类型Numer()/方便new时用的Numer(Numer num)d=num.d;n=num.n;/把String 转换成数值void rnumber(String str)if(str.indexOf(“.“)!=-1)d=Double.parseDouble(str);n=0;is_int=false;elsen=Integer.parseInt(str);d=0;is_int=true;/求倒数void countdown()if(d=0return;if(is_int)d=1/(double)n;n=1/n;if(d=n)d=0;is_int=true;else n=0;is_int=false;else JOptionPane.showMessageDialog(Caculat.this,String.format(“%s“, “错误!分母为整数!“);/输出数值Number putnum()if(is_int)return n;else return d;/加法void add(Numer num)if(num.is_int)if(is_int)n+=num.n;elsed+=num.n;elsed+=num.d+n;n=0;is_int=false;/减法void sub(Numer num)if(num.is_int)if(is_int)n-=num.n;elsed-=num.n;elsed+=n-num.d;n=0;is_int=false;/乘法void mul(Numer num)if(num.is_int)if(is_int)n*=num.n;elsed*=num.n;elsed=d*num.d+n*num.d;n=0;is_int=false;/除法void divide(Numer num)if(num.is_int)if(is_int)n/=num.n;elsed/=num.n;elsed=d/num.d+n/num.d;n=0;is_int=false;/求余数void remnant(Numer num)if(is_intelse JOptionPane.showMessageDialog(Caculat.this,String.format(“%s“, “求余数的参数必须为整数!“);/求根void sqrt()if(d+n0)JOptionPane.showMessageDialog(Caculat.this,String.format(“%s“, “错误!负数没有实根!“);return;if(is_int)d=java.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论