《JAVA程序设计》课程设计
简单计算器
姓名:陈凯昂
班级:物联网(二)班
学号:121210325
指导教师:李玮瑶
成绩:
完成时间:2014.06.12
一、设计目的
使用Java的GUI图形用户界面编程设计并编写一个计算器程序,用户可以通过鼠标或者键盘操作输入参加运算的的数值和运算符,要求能进行加、减、乘、除等混合运算。
二、功能介绍
本程序能实现下列各项功能:
(1)实现加、减、乘、除等基本运算;
(2)实现开方,百分率,倒数等运算;
(3)实现退格,清除,存储,读取存储数据等功能。
三、概要设计
3.1 自定义类说明
class CalFrame extends JFrame//自定义子类CalFrame继承于父类JFrame;
class CalService//计算器计算方法;
class MyMath//算数进度运算;
public class Cal //主类;
3.2 方法定义说明
private final String[] ...//定义按键字符
private final JButton button//定义按键
private JPanel panel//定义面板
private JTextField//定义文本
private JTextArea//定义文本区域
private JButton[]//定义按键组
public void initialize()//初始化计算器界面
public ActionListener getActionListener()//设置侦听器
public void actionPerformed(final ActionEvent e)//设置动作事件
private JTextField getTextField()//初始化输入框
private JButton[] getMButton()//获取计算器的存储区显示等按键
private JButton[] getRButton()//获得计算器的退格清零等按键
private JButton[] getNButton()//获得计算器的加减乘除等其他按键
public void setTextArea(JTextArea textArea)//设置文本区域
public String callMethod(String cmd,String text)//调用该方法并返回计算结果
public String cal(String text,boolean isPercent)//用来结算加、减、乘、除法,并返回封装成String 类型的结果,参数text是显示框中的内容,boolean代表是否有“%”运算
public String setReciprocal(String text)//计算倒数
public String sqrt(String text)//开方运算
public String setOp(String cmd,String text)//设置操作符
public String setNegative(String text)//设置正负数,text是正数是返回负数数字字符串,反之,返回正数数字字符串
public String catNum(String cmd,String text)//连接输入的数字,每次单击数字,都把新加数字追加到后面,并封装成字符串返回
public String backSpace(String text)//退后一个字符,并返回结果
public String mCmd(String cmd,String text)//用来实现“M+”“MC”“MR”“MS”等与存储有关的功能
public String clearAll()//清空所有计算结果
public String clear(String text)//清除上次计算结果
四、详细设计
4.1简单计算器界面设计
1、具体实现过程
本程序采用Calaframe子类继承于父类JFrame,采用BorderLayout边界布局和GridLayout网格布局,将面板添加到里面来布置文本区域以及按键区域。同时,设置监听器ActionListener来
实现各个按键的动作功能。
2、关键代码设计
//导入组件
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
//定义继承父类Jframe 的子类CalFrame
class CalFrame extends JFrame
{
private static final long serialVersionUID = -4043419751779156119L;
privatef inal String[] nOp = {"7","8","9","/","sqrt","4","5","6","*","%","1","2","3","-","1/x","0","+/-",".","+","="};
private final String[] mOp = {"MC","MR","MS","M+"};
private final String[] rOp = {"BackSpace","CE","C"};
private final String opString = "+-*/";
private final JButton button = new JButton();
private final CalService service = new CalService();
private JPanel panel;
private JTextField textField1;
private JTextField textField2;
private JTextArea textArea;
private JButton[] mButton;
private JPanel panel1;//显示框放置区
private JPanel panel2;//按键组m放置区
private JButton[] rButton;
private JPanel panel3;
private JPanel panel31;//按键组r放置区
private JButton[] nButton;
private JPanel panel32;//其他按键放置区
public CalFrame()
{
super();//访问父类
initialize();
}
public void initialize()//初始化计算器界面
{
this.setTitle("计算器by陈凯昂");
panel = new JPanel();
panel.setLayout(new BorderLayout(10,10));
panel1 = new JPanel(new BorderLayout());
panel1.setBackground(Color.white);
getTextField();
panel1.add(textField1,BorderLayout.CENTER);
panel1.add(textField2,BorderLayout.NORTH);
panel2 = new JPanel();
mButton = getMButton();
panel2.setLayout(new GridLayout(5,1,0,5));
for(final JButton b:mButton) panel2.add(b);
panel3 = new JPanel();
panel3.setLayout(new BorderLayout(0,3));
rButton = getRButton();
panel31 = new JPanel();
panel31.setLayout(new GridLayout(1,3,3,0));
for(final JButton b: rButton)panel31.add(b);
nButton = getNButton();
panel32 = new JPanel();
panel32.setLayout(new GridLayout(4,5,3,3));
for(final JButton b: nButton)panel32.add(b);
panel3.add(panel31,BorderLayout.NORTH);
panel3.add(panel32);
panel.add(panel1,BorderLayout.NORTH);
panel.add(panel2,BorderLayout.WEST);
panel.add(panel3);
this.add(panel);
this.setResizable(false);
this.setLocationRelativeTo(null);
}
//设置侦听器
public ActionListener getActionListener()
{
return new ActionListener()
{
public void actionPerformed(final ActionEvent e)
{
final String cmd = e.getActionCommand();
String result = null;
try
{
result = service.callMethod(cmd,textField1.getText());
}
catch(final Exception ex)
{
System.out.println(ex.getMessage());
}
if(opString.indexOf(cmd) != -1)
{
textField2.setText(textField2.getText()+textField1.getText()+cmd);
}
else if(cmd.equals("="))
{
textField2.setText("");
}
else if(cmd.indexOf("MC") == 0)
button.setText("");
else
if(cmd.indexOf("M") == 0 && service.getStore() > 0)
button.setText("M");
if(result != null)
textField1.setText(result);
}
};
}
//初始化输入框
private JTextField getTextField()
{
textField1 = new JTextField();
textField1.setBorder(new EmptyBorder(0,0,0,0));
textField1.setText("0");
textField1.setHorizontalAlignment(JTextField.RIGHT);
textField1.setEditable(false);
textField1.setOpaque(false);
textField2 = new JTextField();
textField2.setBorder(new EmptyBorder(0,0,0,0));
textField2.setHorizontalAlignment(JTextField.RIGHT);
textField2.setEditable(false);
textField2.setOpaque(false);
return null;
}
//获得计算器的存储显示等按键
private JButton[] getMButton()
{
final JButton[] result = new JButton[this.mOp.length+1];
result[0] = this.button;
for(int i = 0;i < this.mOp.length;i++)
{
final JButton b = new JButton(this.mOp[i]);
b.addActionListener(getActionListener());
b.setForeground(Color.black);
result[i+1] = b;
}
return result;
}
//获得计算器的退格清零等按键
private JButton[] getRButton()
{