当前位置:文档之家› java编写的简单的计算器程序

java编写的简单的计算器程序

计算器项目内容:编写一个Applet,模仿windows附件所带计算器的功能,可以帮助用户完成计算功能,具体如下图所示。

项目要求:使用图形的方式借助窗口、菜单、按钮等标准界面元素和鼠标操作,来帮助用户方便地向计算机系统发出命令,启动操作,并将系统运行的结果同样以图形的方式显示给用户,这样更加直观和生动;1.Applet容器中组件的添加与设置,包括面板以及菜单的使用;2.容器中组件的布局管理;3.Java核心包中数组、数学计算类的使用;4.异常的处理;5.事件处理模型中的三类对象的使用:1.Event-事件,用户对界面操作在java语言上的描述,以类的形式出现,例如键盘操作对应的事件类是KeyEvent。

2.Event Source-事件源,事件发生的场所,通常就是各个组件,例如按钮Button。

3.Event handler-事件处理者,接收事件对象并对其进行处理的对象。

6.程序中事件处理的流程:1.计算流程的细化参考代码:import java.awt.*;import ng.*;import javax.swing.*;import javax.swing.event.*;import java.awt.event.*;import java.text.DecimalFormat;public class Calculatorimplements ActionListener { //导入动作监听接口//设计面板中的单位JFrame frame;JTextField textAnswer;JPanel panel, panel1, panel2, panel3;JMenuBar mainMenu;JTextField textMemory;JLabel labelMemSpace; //labelMemSpace单纯做摆设,控制面板的形状JButton buttonBk, buttonCe, buttonC;JButton button[];JButton buttonMC, buttonMR, buttonMS, buttonMAdd;JButton buttonDot, buttonAddAndSub, buttonAdd, buttonSub, buttonMul, buttonDiv, buttonMod;JButton buttonSqrt, buttonDao, buttonEqual;JMenu editMenu, viewMenu, helpMenu;JMenuItem copyItem, pasteItem, tItem, sItem, numberGroup, topHelp, aboutCal; DecimalFormat df; //设置数据输出精度boolean clickable; //控制当前能否按键double memoryd; //使用内存中存储的数字int memoryi;double vard, answerd; //用来保存double型数据的中间值(vard)和最后结果(answerd)short key = -1, prekey = -1; //key用来保存当前进行何种运算,prekey用来保存前次进行何种运算String copy; //做复制用JTextArea help; //帮助JScrollPane scrollHelp;//构造函数public Calculator() {clickable = true;answerd = 0;frame = new JFrame("计算器");df = new DecimalFormat("0.##############"); //设置数据输出精度(对于double型值) textAnswer = new JTextField(15);textAnswer.setText("");textAnswer.setEditable(false);textAnswer.setBackground(new Color(255, 255, 255));panel = new JPanel();frame.getContentPane().add(panel);panel1 = new JPanel();panel2 = new JPanel();panel.setLayout(new BorderLayout());//设计整个面板mainMenu = new JMenuBar();editMenu = new JMenu("编辑(E)");viewMenu = new JMenu("查看(V)");helpMenu = new JMenu("帮助(H)");copyItem = new JMenuItem(" 复制(C) Ctrl+C");copyItem.addActionListener(this);pasteItem = new JMenuItem(" 粘贴(V) Ctrl+V");pasteItem.addActionListener(this);editMenu.add(copyItem);editMenu.add(pasteItem);tItem = new JMenuItem("●标准型(T)");tItem.addActionListener(this);sItem = new JMenuItem(" 科学型(S)");sItem.addActionListener(this);numberGroup = new JMenuItem(" 数字分组(I)");numberGroup.addActionListener(this);viewMenu.add(tItem);viewMenu.add(sItem);viewMenu.add(numberGroup);topHelp = new JMenuItem(" 帮助主题(H)");topHelp.addActionListener(this);help = new JTextArea(5, 20);scrollHelp = new JScrollPane(help);help.setEditable(false);help.append("执行简单计算\n");help.append("1. 键入计算的第一个数字。

\n");help.append("2. 单击“+”执行加、“-”执行减、“*”执行乘或“/”执行除。

\n"); help.append("3. 键入计算的下一个数字。

\n");help.append("4. 输入所有剩余的运算符和数字。

\n");help.append("5. 单击“=”。

\n");aboutCal = new JMenuItem(" 关于计算器(A)");aboutCal.addActionListener(this);helpMenu.add(topHelp);helpMenu.add(aboutCal);mainMenu.add(editMenu);mainMenu.add(viewMenu);mainMenu.add(helpMenu);panel.add(mainMenu, BorderLayout.NORTH);panel.add(textAnswer, BorderLayout.CENTER);panel.add(panel1, BorderLayout.SOUTH);panel1.setLayout(new BorderLayout());textMemory = new JTextField(3);textMemory.setEditable(false);textMemory.setBackground(new Color(217, 217, 217)); labelMemSpace = new JLabel(" "); buttonBk = new JButton("Backspace");buttonBk.setForeground(new Color(255, 0, 0)); buttonCe = new JButton("CE");buttonCe.setForeground(new Color(255, 0, 0)); buttonC = new JButton("C");buttonC.setForeground(new Color(255, 0, 0)); buttonBk.addActionListener(this);buttonCe.addActionListener(this);buttonC.addActionListener(this);panel1.add(panel2, BorderLayout.NORTH);panel2.setLayout(new FlowLayout(FlowLayout.RIGHT)); panel2.add(textMemory);panel2.add(labelMemSpace);panel2.add(buttonBk);panel2.add(buttonCe);panel2.add(buttonC);panel3 = new JPanel();panel1.add(panel3, BorderLayout.CENTER);button = new JButton[10];for (int i = 0; i < button.length; i++) {button[i] = new JButton(Integer.toString(i));button[i].setForeground(new Color(0, 0, 255));}buttonMC = new JButton("MC");buttonMC.setForeground(new Color(255, 0, 0)); buttonMR = new JButton("MR");buttonMR.setForeground(new Color(255, 0, 0)); buttonMS = new JButton("MS");buttonMS.setForeground(new Color(255, 0, 0)); buttonMAdd = new JButton("M+");buttonMAdd.setForeground(new Color(255, 0, 0)); buttonDot = new JButton(".");buttonDot.setForeground(new Color(0, 0, 255)); buttonAddAndSub = new JButton("+/-"); buttonAddAndSub.setForeground(new Color(0, 0, 255)); buttonAdd = new JButton("+");buttonAdd.setForeground(new Color(255, 0, 0)); buttonSub = new JButton("-");buttonSub.setForeground(new Color(255, 0, 0)); buttonMul = new JButton("*");buttonMul.setForeground(new Color(255, 0, 0)); buttonDiv = new JButton("/");buttonDiv.setForeground(new Color(255, 0, 0)); buttonMod = new JButton("%");buttonMod.setForeground(new Color(0, 0, 255)); buttonSqrt = new JButton("sqrt");buttonSqrt.setForeground(new Color(0, 0, 255)); buttonDao = new JButton("1/x");buttonDao.setForeground(new Color(0, 0, 255)); buttonEqual = new JButton("=");buttonEqual.setForeground(new Color(255, 0, 0));//将所有行为与监听绑定panel3.setLayout(new GridLayout(4, 6));panel3.add(buttonMC);panel3.add(button[7]);button[7].addActionListener(this); panel3.add(button[8]);button[8].addActionListener(this); panel3.add(button[9]);button[9].addActionListener(this); panel3.add(buttonDiv); buttonDiv.addActionListener(this); panel3.add(buttonSqrt); buttonSqrt.addActionListener(this); panel3.add(buttonMR); buttonMR.addActionListener(this); panel3.add(button[4]);button[4].addActionListener(this); panel3.add(button[5]);button[5].addActionListener(this); panel3.add(button[6]);button[6].addActionListener(this); panel3.add(buttonMul); buttonMul.addActionListener(this); panel3.add(buttonMod); buttonMod.addActionListener(this); panel3.add(buttonMS); buttonMS.addActionListener(this); panel3.add(button[1]);button[1].addActionListener(this); panel3.add(button[2]);button[2].addActionListener(this); panel3.add(button[3]);panel3.add(buttonSub);buttonSub.addActionListener(this);panel3.add(buttonDao);buttonDao.addActionListener(this);panel3.add(buttonMAdd);buttonMAdd.addActionListener(this);panel3.add(button[0]);button[0].addActionListener(this);panel3.add(buttonAddAndSub);buttonAddAndSub.addActionListener(this);panel3.add(buttonDot);buttonDot.addActionListener(this);panel3.add(buttonAdd);buttonAdd.addActionListener(this);panel3.add(buttonEqual);buttonEqual.addActionListener(this);frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);frame.pack();frame.show();}//设置各个按钮行为public void actionPerformed(ActionEvent event) {boolean sign = false; //判断是否是double型数参与运算,是为true,不是为false Object temp = event.getSource();try {//如果按下数据按钮,将按下的按钮代表的数据插入的当前文本框字符串之后for (int i = 0; i <= 9; i++)if (temp == button[i] && clickable == true)textAnswer.setText(textAnswer.getText() + Integer.toString(i));//按下'.'按钮时,判断当前文本框内字符串中含不含'.',如果已含,则不允许再插入'.' if (temp == buttonDot && clickable == true) {boolean isDot = false;if (textAnswer.getText().length() == 0)isDot = true;for (int i = 0; i < textAnswer.getText().length(); i++)if ('.' == textAnswer.getText().charAt(i)) {isDot = true;break;}if (isDot == false)textAnswer.setText(textAnswer.getText() + ".");}if ( (temp == buttonAdd || temp == buttonSub || temp == buttonMul || temp == buttonDiv) && clickable == true) {//'+'操作if (temp == buttonAdd) {switch (prekey) {case 0:answerd += Double.parseDouble(textAnswer.getText());break;case 1:answerd -= Double.parseDouble(textAnswer.getText());break;case 2:answerd *= Double.parseDouble(textAnswer.getText());break;case 3:if (Double.parseDouble(textAnswer.getText()) == 0) {textAnswer.setText("除数不能为零");clickable = false;}elseanswerd /= Double.parseDouble(textAnswer.getText());break;default:answerd = Double.parseDouble(textAnswer.getText()); }textAnswer.setText("");prekey = key = 0;}//'-'操作if (temp == buttonSub) {switch (prekey) {case 0:answerd += Double.parseDouble(textAnswer.getText());break;case 1:answerd -= Double.parseDouble(textAnswer.getText());break;case 2:answerd *= Double.parseDouble(textAnswer.getText());break;case 3:if (Double.parseDouble(textAnswer.getText()) == 0) {textAnswer.setText("除数不能为零");clickable = false;}elseanswerd /= Double.parseDouble(textAnswer.getText());break;default:answerd = Double.parseDouble(textAnswer.getText()); }textAnswer.setText("");prekey = key = 1;}//'*'操作if (temp == buttonMul) {switch (prekey) {case 0:answerd += Double.parseDouble(textAnswer.getText());break;case 1:answerd -= Double.parseDouble(textAnswer.getText());break;case 2:answerd *= Double.parseDouble(textAnswer.getText());break;case 3:if (Double.parseDouble(textAnswer.getText()) == 0) {textAnswer.setText("除数不能为零");clickable = false;}elseanswerd /= Double.parseDouble(textAnswer.getText());break;default:answerd = Double.parseDouble(textAnswer.getText()); }textAnswer.setText("");prekey = key = 2;}//'/'操作if (temp == buttonDiv) {switch (prekey) {case 0:answerd += Double.parseDouble(textAnswer.getText());break;case 1:answerd -= Double.parseDouble(textAnswer.getText());break;case 2:answerd *= Double.parseDouble(textAnswer.getText());break;case 3:if (Double.parseDouble(textAnswer.getText()) == 0) {textAnswer.setText("除数不能为零");clickable = false;}elseanswerd /= Double.parseDouble(textAnswer.getText());break;default:answerd = Double.parseDouble(textAnswer.getText());}textAnswer.setText("");prekey = key = 3;}}//'='操作if (temp == buttonEqual && clickable == true) {//如果连续按'=',则进行连续运算if (prekey == 5) {if (key == 0) {answerd += vard;textAnswer.setText(df.format(answerd));}if (key == 1) {answerd -= vard;textAnswer.setText(df.format(answerd));}if (key == 2) {answerd *= vard;textAnswer.setText(df.format(answerd));}if (key == 3) {if (Double.parseDouble(textAnswer.getText()) == 0) { textAnswer.setText("除数不能为零");clickable = false;}else {answerd /= vard;textAnswer.setText(df.format(answerd));}}}else {vard = Double.parseDouble(textAnswer.getText());if (key == 0) {prekey = -1;answerd += Double.parseDouble(textAnswer.getText());textAnswer.setText(df.format(answerd));}if (key == 1) {prekey = -1;answerd -= Double.parseDouble(textAnswer.getText());textAnswer.setText(df.format(answerd));}if (key == 2) {prekey = -1;answerd *= Double.parseDouble(textAnswer.getText());textAnswer.setText(df.format(answerd));}if (key == 3) {prekey = -1;if (Double.parseDouble(textAnswer.getText()) == 0) {textAnswer.setText("除数不能为零");clickable = false;}else {answerd /= Double.parseDouble(textAnswer.getText());textAnswer.setText(df.format(answerd));}}}prekey = 5;}//'%'操作,对第二个操作数除以100if (temp == buttonMod && clickable == true) {if (answerd == 0) {String s = textAnswer.getText();textAnswer.setText(s);}else {boolean isDot = false;for (int i = 0; i < textAnswer.getText().length(); i++)if ('.' == textAnswer.getText().charAt(i)) {isDot = true;break;}//如果是double数,除100if (isDot == true) {double dtemp = Double.parseDouble(textAnswer.getText());dtemp = dtemp / 100.0;textAnswer.setText(Double.toString(dtemp));}else {//如果是int数但能被100整除,则去掉末尾两个零if (Integer.parseInt(textAnswer.getText()) % 100 == 0) {int itemp = Integer.parseInt(textAnswer.getText());itemp /= 100;textAnswer.setText(Integer.toString(itemp));}//如果是int数,但不能被100整除,则按double数处理else {double dtemp = Double.parseDouble(textAnswer.getText());dtemp = dtemp / 100.0;textAnswer.setText(Double.toString(dtemp));}}}}//开根号运算if (temp == buttonSqrt && clickable == true) {String s = textAnswer.getText();if (s.charAt(0) == '-') {textAnswer.setText("负数不能开根号");clickable = false;}elsetextAnswer.setText(Double.toString(ng.Math.sqrt(Double.parseDouble(textAnswer.getText()))));}//倒数运算if (temp == buttonDao && clickable == true) {if (textAnswer.getText().charAt(0) == '0' &&textAnswer.getText().length() == 1) {textAnswer.setText("零不能求倒数");clickable = false;}else {boolean isDec = true;int i, j, k;String s = Double.toString(1 / Double.parseDouble(textAnswer.getText()));for (i = 0; i < s.length(); i++)if (s.charAt(i) == '.')break;for (j = i + 1; j < s.length(); j++)if (s.charAt(j) != '0') {isDec = false;break;}if (isDec == true) {String stemp = "";for (k = 0; k < i; k++)stemp += s.charAt(k);textAnswer.setText(stemp);}elsetextAnswer.setText(s);}}//按下'+/-'按钮时处理if (temp == buttonAddAndSub && clickable == true) {boolean isNumber = true;String s = textAnswer.getText();for (int i = 0; i < s.length(); i++)if (! (s.charAt(i) >= '0' && s.charAt(i) <= '9' || s.charAt(i) == '.' || s.charAt(i) == '-')) {isNumber = false;break;}if (isNumber == true) {//如果当前字符串首字母有'-'号,代表现在是个负数,再按下时,则将首符号去掉if (s.charAt(0) == '-') {textAnswer.setText("");for (int i = 1; i < s.length(); i++) {char a = s.charAt(i);textAnswer.setText(textAnswer.getText() + a);}}//如果当前字符串第一个字符不是符号,则添加一个符号在首字母处elsetextAnswer.setText('-' + s);}}//计算器有关内存操作//'MC'的操作,将内存清0if (temp == buttonMC && clickable == true) {memoryd = memoryi = 0;textMemory.setText("");}//'MS'的操作,将当前文本框内容保存入内存,显示'M'if (temp == buttonMS && clickable == true) {boolean isDot = false;textMemory.setText(" M");for (int i = 0; i < textAnswer.getText().length(); i++)if ('.' == textAnswer.getText().charAt(i)) {isDot = true;break;}//如果是double,则存入memoryd(double存储器)if (isDot == true) {memoryd = Double.parseDouble(textAnswer.getText());memoryi = 0; //保证存储器中存放最新的值}//如果是int,则存入memoryi(int存储器)else {memoryi = Integer.parseInt(textAnswer.getText());memoryd = 0; //保证存储器中存放最新的值}}//'MR'的操作,将存储器中的信息输出if (temp == buttonMR && clickable == true) {if (memoryd != 0)textAnswer.setText(Double.toString(memoryd));if (memoryi != 0)textAnswer.setText(Integer.toString(memoryi));}//'M+'的功能,将当前文本框里的数据和存储器中数据相加后,再存入存储器if (temp == buttonMAdd && clickable == true) {boolean isDot = false;for (int i = 0; i < textAnswer.getText().length(); i++)if ('.' == textAnswer.getText().charAt(i)) {isDot = true;break;}if (memoryi != 0) { //存储中是一个int型数if (isDot == false) //被加数是一个int型数memoryi += Integer.parseInt(textAnswer.getText());else { //被加数是一个double型数,则将int存储器中数传入double存储器与当前数相加,int 存储器清零memoryd = memoryi + Double.parseDouble(textAnswer.getText());memoryi = 0;}}elsememoryd += Double.parseDouble(textAnswer.getText());}//按下'Backspace'键,利用循环将当前字符串中的最后一个字母删除if (temp == buttonBk && clickable == true) {String s = textAnswer.getText();textAnswer.setText("");for (int i = 0; i < s.length() - 1; i++) {char a = s.charAt(i);textAnswer.setText(textAnswer.getText() + a);}}//按下'CE'按钮,将当前文本框内数据清除if (temp == buttonCe) {textAnswer.setText("");clickable = true;}//按下'C'按钮,文本框内数据清除,同时var,answer清0if (temp == buttonC) {vard = answerd = 0;textAnswer.setText("");clickable = true;}//按下'复制'菜单栏if (temp == copyItem) {copy = textAnswer.getText();}//按下'粘贴'菜单栏if (temp == pasteItem) {textAnswer.setText(copy);}if (temp == sItem) {JOptionPane.showMessageDialog(panel, "当前是标准型计算器,\n科学型计算器有待更新。

相关主题