1、 一、目标: 通过Java程序开发实训使学生掌握《面向对象程序设计(Java)》课堂讲授的内容,灵活运用到Java程序的开发与设计中。 二、要求: 按时参加Java程序开发实训训练,不得迟到和早退;独立完成程序设计;按要求撰写实践报告。 三、详细内容: 使用《面向对象程序设计(Java)》课程讲授内容,编写一个简单的计算器,要求实现如下功能: 1. 进行图形界面设计 通过图形界面设计,掌握JFrame类、JPanel类、5种布局管理器、文本框、标签及按钮的使用方法。 2. 实现计算器的基本功能 包括加减乘除四则运算、倒数、平方根及清除结果等功能。 3. 实
2、现计算器的存储计算功能 包括存储中间结果(MS)、使用中间结果(MR)、累加中间结果(M+)及清除中间结果(MC)的功能。 4. 计算器的扩展功能 包括乘方、对数、正弦、余弦、正切、余切、反正弦、反余弦、反正切、反余切及2进制、8进制、16进制、10进制之间的相互转换等功能。 四、源代码 import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.Ac
3、tionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.text.DecimalFormat; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; i
4、mport javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; public class jsq implements ActionListener { //导入动作监听接口 //设计面板中的单位 JFrame frame;//窗口 JTextField textAnswer;//文本 JPanel panel, panel1, panel2, panel3;//面版
5、 JMenuBar mainMenu;//菜单 JTextField textMemory; JLabel labelMemSpace; //labelMemSpace单纯做摆设,控制面板的形状 JButton buttonBk, buttonCe, buttonC; JButton button[];//按钮数组 JButton buttonMC, buttonMR, buttonMS, buttonMAdd;//清除,使用,储存,添加 JButton buttonDot, buttonAddAndSub, b
6、uttonAdd, buttonSub, buttonMul, buttonDiv, buttonMod; JButton buttonSqrt, buttonDao, buttonEqual; JMenu editMenu, viewMenu, helpMenu; JMenuItem copyItem, pasteItem, tItem, sItem, numberGroup, topHelp, aboutCal; DecimalFormat df; //设置数据输出精度 bo
7、olean clickable; //控制当前能否按键 double memoryd; //使用内存中存储的数字 int memoryi; double vard, answerd; //用来保存double型数据的中间值(vard)和最后结果(answerd) short key = -1, prekey = -1; //key用来保存当前进行何种运算,prekey用来保存前次进行何种运算 String copy; //做复制用 JTextArea help; //帮助 JScrollPane scrollH
8、elp; //构造函数 public jsq() { clickable = true; answerd = 0; frame = new JFrame("计算器"); df = new DecimalFormat("0.##############"); //设置数据输出精度(对于double型值) textAnswer = new JTextField(15); textAnswer.setText(""); textAnswe
9、r.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()); //设计整个面板
10、 mainMenu = new JMenuBar(); editMenu =new JMenu("编辑(E)"); editMenu .setMnemonic(KeyEvent.VK_E); viewMenu =new JMenu("查看(V)"); viewMenu .setMnemonic(KeyEvent.VK_V); helpMenu =new JMenu("帮助(H)"); helpMenu .setMnemonic(KeyEvent.VK_H);
11、 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(
12、)); 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));
13、 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.addActionL
14、istener(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);
15、 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)); }
16、 //构造按钮 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)
17、); 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,
18、 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))
19、 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));
20、 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
21、); buttonMC.addActionListener(this); 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.ad
22、d(buttonDiv); buttonDiv.addActionListener(this); panel3.add(buttonSqrt); buttonSqrt.addActionListener(this); panel3.add(buttonMR); buttonMR.addActionListener(this); panel3.add(button[4]); button[4].addActionListener(this);
23、 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(th
24、is); 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]); button[3].addActionL
25、istener(this); panel3.add(buttonSub); buttonSub.addActionListener(this); panel3.add(buttonDao); buttonDao.addActionListener(this); panel3.add(buttonMAdd); buttonMAdd.addActionListener(this); panel3.add(button[0]); button
26、[0].addActionListener(this); panel3.add(buttonAddAndSub); buttonAddAndSub.addActionListener(this); panel3.add(buttonDot); buttonDot.addActionListener(this); panel3.add(buttonAdd); buttonAdd.addActionListener(this); panel3.add(butt
27、onEqual); buttonEqual.addActionListener(this); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.show(); } //设置各个按钮行为 public void actionPerformed(ActionEvent event) { boolean sign = false; //判断是否是double型数参与运算
28、是为true,不是为false Object temp = event.getSource(); try { //如果按下数据按钮,将按下的按钮代表的数据插入的当前文本框字符串之后 for (int i = 0; i <= 9; i++) if (temp == button[i] && clickable == true) textAnswer.setText(textAnswer.getText()
29、 + Integer.toString(i)); //按下"."按钮时,判断当前文本框内字符串中含不含".",如果已含,则不允许再插入"." if (temp == buttonDot && clickable == true) { boolean isDot = false; if (textAnswer.getText().length() == 0) isDot = true
30、 for (int i = 0; i < textAnswer.getText().length(); i++) if ('.' == textAnswer.getText().charAt(i)) { isDot = true; break; } if (isDot == false)
31、textAnswer.setText(textAnswer.getText() + "."); } if ((temp == buttonAdd || temp == buttonSub || temp == buttonMul || temp == buttonDiv) && clickable == true) { //"+"操作 if (temp == buttonAdd) {
32、 switch (prekey) { case 0: answerd += Double.parseDouble(textAnswer.getText()); break; case 1: answerd -= Double.parseDouble(textAnswer.getText()); bre
33、ak; case 2: answerd *= Double.parseDouble(textAnswer.getText()); break; case 3: if (Double.parseDouble(textAnswer.getText()) == 0) { //textAnswer="a
34、a"; textAnswer.setText("除数不能为零"); clickable = false; } else answerd /= Double.parseDouble(textAnswer.getText()); break; default:
35、 answerd = Double.parseDouble(textAnswer.getText()); } textAnswer.setText(""); prekey = key = 0; } //"-"操作 if (temp == buttonSub) { switch (
36、prekey) { case 0: answerd += Double.parseDouble(textAnswer.getText()); break; case 1: answerd -= Double.parseDouble(textAnswer.getText()); break;
37、 case 2: answerd *= Double.parseDouble(textAnswer.getText()); break; case 3: if (Double.parseDouble(textAnswer.getText()) == 0) { textAnswer.setText("除数不能为
38、零"); clickable = false; } else answerd /= Double.parseDouble(textAnswer.getText()); break; default: answerd = Double.parseDouble(textAnswer.
39、getText()); } textAnswer.setText(""); prekey = key = 1; } //"*"操作 if (temp == buttonMul) { switch (prekey) { case 0:
40、 answerd += Double.parseDouble(textAnswer.getText()); break; case 1: answerd -= Double.parseDouble(textAnswer.getText()); break; case 2: answerd *
41、 Double.parseDouble(textAnswer.getText()); break; case 3: if (Double.parseDouble(textAnswer.getText()) == 0) { textAnswer.setText("除数不能为零"); clickable = false;
42、 } else answerd /= Double.parseDouble(textAnswer.getText()); break; default: answerd = Double.parseDouble(textAnswer.getText()); } /
43、/textAnser = ""; textAnswer.setText(""); prekey = key = 2; } //"/"操作 if (temp == buttonDiv) { switch (prekey) { case 0: answerd += D
44、ouble.parseDouble(textAnswer.getText()); break; case 1: answerd -= Double.parseDouble(textAnswer.getText()); break; case 2: answerd *= Double.parseDoubl
45、e(textAnswer.getText()); break; case 3: if (Double.parseDouble(textAnswer.getText()) == 0) { textAnswer.setText("除数不能为零"); clickable = false;
46、 } else answerd /= Double.parseDouble(textAnswer.getText()); break; default: answerd = Double.parseDouble(textAnswer.getText()); } textAnswer.setText("
47、"); prekey = key = 3; } } //"="操作 if (temp == buttonEqual && clickable == true) { //如果连续按"=",则进行连续运算 if (prekey == 5) { if (key == 0) {
48、 answerd += vard; textAnswer.setText(df.format(answerd)); } if (key == 1) { answerd -= vard; textAnswer.setText(df.format(answerd)); }
49、 if (key == 2) { answerd *= vard; textAnswer.setText(df.format(answerd)); } if (key == 3) { if (Double.parseDouble(textAnswer.getText()) == 0) { te
50、xtAnswer.setText("除数不能为零"); clickable = false; } else { answerd /= vard; textAnswer.setText(df.format(answerd)); } } }






