设计一个图形界面的简易计算器,完成简单的算术运算符,可以完成加法、减法、乘法、除法和取余运算。这里只是提供了各个部分功能式怎么处理的,不是完整的代码。如果需要的话,自己读一下代码,因为基本每行代码都有注释,应该看起来也很简单,适合小白学习(本人就是小白)。
这个有个需要改进就行文本框不能整个显示出算式例如:“1+2=3” 只是显示你点击的1和2,然后最好显示结果,课设时间紧,就没完善。
首先设计需要的数字键,现实文本框
//计算器上的键的显示名字
private String[] KEYS= { "7", "8", "9", "+", "4", "5", "6",
"-", "*", "1", "2", "3", "/", "0", ".","c", "%", "="};
//计算器上键的按钮
private JButton keys[] = new JButton[KEYS.length];
//计算结果文本框
private JTextField resultText = new JTextField("0",21);
//用户是否按的是整个表达式的第一个数字或者是运算符后的第一个数字
private boolean firstDigit = true;
//计算的中间结果
private double resultNum = 0.0;
// 当前运算的运算符
private String operator = "=";
// 操作是否合法
private boolean operateValidFlag = true;
对计算器背景颜色、标题和显示位置进行设计
public Calculator()
{
super();
// 初始化计算器
init();
// 设置计算器的背景颜色
this.setBackground(Color.LIGHT_GRAY);
//设置计算器标题
this.setTitle("计算器");
// 在屏幕(500, 300)坐标处显示计算器
this.setLocation(500, 300);
// 不许修改计算器的大小
this.setResizable(false);
// 使计算器中各组件大小合适
this.pack();
}
初始化计算器
这里我建议使用setLayout布局比较合适,因为这里数字键和功能键都是几行几列整齐形的。
public void init()
{
//设置文本框中的内容向右对齐
resultText.setHorizontalAlignment(JTextField.RIGHT);
//不允许修改文本框内容
resultText.setEditable(false);
//设置文本框背景为白色
resultText.setBackground(Color.WHITE);
//初始化计算器上键的按钮,并将键放在一个画板内
JPanel calckeysPanel = new JPanel();
//布局一个4行3列的网格,并且网格之间的水平间隔为3个像素,垂直间隔为3个像素
calckeysPanel.setLayout(new GridLayout(4,3,3,3));
for(int i=0;i<keys.length;i++)
{
keys[i] = new JButton(KEYS[i]);
calckeysPanel.add(keys[i]);
keys[i].setForeground(Color.BLUE);
//事件监听器
keys[i].addActionListener(this);
}
//初始化计算器上键的按钮,并将键放在一个画板内
JPanel calckeysPane2 = new JPanel();
//布局一个1行1列的网格,并且网格之间的水平间隔为3个像素,垂直间隔为3个像素
calckeysPane2.setLayout(new GridLayout(1,1,3,3));
calckeysPane2.add(keys[17]);
//calckeysPanel.add("South",calckeysPane2);
//运算符用红键标示,其他用蓝键
keys[3].setForeground(Color.red);
keys[7].setForeground(Color.red);
keys[8].setForeground(Color.red);
keys[12].setForeground(Color.red);
keys[16].setForeground(Color.red);
// 初始化功能键,都用红色标示。将功能键放在一个画板内
JPanel commandsPanel = new JPanel();
// 布局一个5行,1列的网格,网格之间的水平方向间隔为3个像素,垂直方向间隔为3个像素
commandsPanel.setLayout(new GridLayout(5, 1, 3, 3));// 行 列 水平 纵向
commandsPanel.add(keys[3]);
commandsPanel.add(keys[7]);
commandsPanel.add(keys[8]);
commandsPanel.add(keys[12]);
commandsPanel.add(keys[16]);
// 下面进行计算器的整体布局,将calckeys和command画板放在计算器的中部,
// 新建一个大的画板,将上面建立的command和calckeys画板放在该画板内
// 画板采用边界布局管理器,画板里组件之间的水平和垂直方向上间隔都为3象素
JPanel panel1 = new JPanel();
panel1.setLayout(new BorderLayout(3, 3));
panel1.add("Center", calckeysPanel);
panel1.add("South",calckeysPane2);
JPanel panel2 = new JPanel();
panel2.setLayout(new BorderLayout(3, 3));
panel2.add("East", commandsPanel);
panel2.add("Center", panel1);
// 建立一个画板放文本框
JPanel top = new JPanel();
top.setLayout(new BorderLayout());
top.add("Center", resultText);
// 整体布局
getContentPane().setLayout(new BorderLayout(3, 5));
getContentPane().add("North", top);
getContentPane().add("Center", panel2);
}
对数字键、功能键和文本框的事件处理
public void actionPerformed(ActionEvent e)
{
//获取事件源的标签
String label = e.getActionCommand();
if ("0123456789.".indexOf(label) >= 0)
{
// 用户按了数字键或者小数点键
handleNumber(label);
}
else if (label.equals(KEYS[15]))
{
// 用户按了"C"键
handleC();
}
else
{
// 用户按了运算符键
handleOperator(label);
}
}
功能键被按下,进入各自的数学函数当中。Java中有很多的数学函数,不需要自己单独写,如果有其他要求,可以去搜素一下相应的函数。除法就要考虑分母不可以为0。
private void handleOperator(String key)
{
if(operator.equals("/"))
{
// 除法运算
// 如果当前结果文本框中的值等于0
if(getNumberFromText() == 0.0)
{
//操作不合法
operateValidFlag = false;
resultText.setText("除数不能为零");
}
else
{
resultNum /= getNumberFromText();
}
}
else if (operator.equals("+"))
{
// 加法运算
resultNum += getNumberFromText();
}
else if (operator.equals("-"))
{
// 减法运算
resultNum -= getNumberFromText();
}
else if (operator.equals("*"))
{
// 乘法运算
resultNum *= getNumberFromText();
}
else if (operator.equals("%"))
{
// 百分号运算
int a = (int) getNumberFromText();
resultNum = Math.floorMod((int) resultNum, a);
}
else if (operator.equals("="))
{
// 赋值运算
resultNum = getNumberFromText();
}
if (operateValidFlag)
{
// 双精度浮点数的运算
long t1;
double t2;
t1 = (long) resultNum;
t2 = resultNum - t1;
if (t2 == 0)
{
resultText.setText(String.valueOf(t1));
}
else
{
resultText.setText(String.valueOf(resultNum));
}
}
// 运算符等于用户按的按钮
operator = key;
firstDigit = true;
operateValidFlag = true;
}
数字键按下的处理
private void handleNumber(String key)
{
if(firstDigit)
{
//输入第一个数字
resultText.setText(key);
}
else if ((key.equals(".")) && (resultText.getText().indexOf(".") < 0))
{
// 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面
resultText.setText(resultText.getText() + ".");
}
else if (!key.equals("."))
{
// 如果输入的不是小数点,则将数字附在结果文本框的后面
resultText.setText(resultText.getText() + key);
}
// 以后输入的肯定不是第一个数字了
firstDigit = false;
}
清除键被按下
private void handleC()
{
// 初始化计算器的各种值
resultText.setText("0");
firstDigit = true;
operator = "=";
}
文本框显示数据
private double getNumberFromText()
{
double result = 0;
try
{
result = Double.valueOf(resultText.getText()).doubleValue();
}
catch (NumberFormatException e)
{
}
return result;
}
这里都是个人的一些看法,因为也是Java大作业课设所以也有借鉴到其他大神的地方。如果有改进的地方也希望大家评论一起探讨学习。