Java模仿Windows自带的计算器功能,设计一个简单计算器
此计算器可以实现整数和小数的加、减、乘、除、清零功能。作为一名树立远大理想想要学好Java的小白,在这里把这学期Java课上老师留下的课后作业完善,也是我一次写博客。(真正意义上的小白!所以思路和代码仅供参考哈,少不了有很多错误的想法)
最近上课在学习GUI这一部分的基础知识,那就只能以我刚刚入门的眼光来解决这个问题。
我们很容易想到计算器有若干个按钮,有0~9的数字按钮以及加减乘除小数点等号按钮,也可能会进一步想着每一个按钮都要加一个监听,每一个按钮都会对应着每一步操作,抱着这么诚实憨厚的想法我开始了自己的愚公式开发…
我先说一下我自己的看法:整体思路我们是将运算过程以及运算结果以一个JLabel标签来显示,我们以加减乘除这四个符号(即运算符)作为前后两个需要做运算的两个数的分隔符,按钮及标签上的数字都是字符串格式的,在等号监听器里面我们将它们变成double类型来进行实际意义上的运算,最后转化成字符串显示在标签上。(后面我们会给出另一种相对简便的思路)
下面是我的实现代码:
import java.awt.*; //导入包
import java.awt.event.*;
import javax.swing.*;
class Jisuan extends JFrame { //计算器
JPanel p1 = new JPanel();
JButton numberbutton[] = new JButton[10];
String numbuttonName[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"};//为了后面对数字按钮的构造
JButton plusbutton = new JButton("+");
JButton minusbutton = new JButton("-");
JButton multipybutton = new JButton("X");
JButton dicisionbutton = new JButton("/");
JButton calbutton = new JButton("=");
JButton pointbutton = new JButton(".");
JLabel label = new JLabel("计算:");
String add1 = ""; //标签上运算符之前的内容
String add2 = "";
String output = "";
boolean plusClicked = false;
boolean minuClicked = false;
boolean multClicked = false;
boolean diciClicked = false;
Double result = 0.0; //输出结果初始化
Jisuan() { //构造方法
setTitle("简易计算器");
getContentPane().setLayout(null);
p1.setBounds(100, 30, 400, 450);
p1.setLayout(new GridLayout(4, 4));
for (int i = 0; i < 10; i++) {
numberbutton[i] = new JButton(numbuttonName[i]); //对数字按钮的构造
numberbutton[i].setFont(new Font("楷体", Font.BOLD, 20));
numberbutton[i].addActionListener(new ActionListener() { //为了简洁下面都会使用这种格式的监听接口实现
public void actionPerformed(ActionEvent e) {
if (!(plusClicked || minuClicked || multClicked || diciClicked)) {
add1 = add1 + e.getActionCommand();
output = "计算:" + add1;
label.setText(output);
} else {
add2 = add2 + e.getActionCommand();
output = output + e.getActionCommand();
label.setText(output);
}
}
});
p1.add(numberbutton[i]);
} // 数字按钮的添加
plusbutton.addActionListener(new ActionListener() { //加号监听事件
public void actionPerformed(ActionEvent e) {
plusClicked = true;
output += "+";
label.setText(output);
}
});
plusbutton.setFont(new Font("楷体", Font.BOLD, 20));
p1.add(plusbutton); //将加号加到面板上
minusbutton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
minuClicked = true;
output += "-";
label.setText(output);
}
});
minusbutton.setFont(new Font("楷体", Font.BOLD, 20)); //为了美观特意把按钮字体调大
p1.add(minusbutton); //将减号加到面板上
multipybutton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
multClicked = true;
output += "*";
label.setText(output);
}
});
multipybutton.setFont(new Font("楷体", Font.BOLD, 20));
p1.add(multipybutton); //将乘号加到面板上
dicisionbutton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
diciClicked = true;
output += "/";
label.setText(output);
}
});
dicisionbutton.setFont(new Font("楷体", Font.BOLD, 20));
p1.add(dicisionbutton); //将除号加到面板上
pointbutton.addActionListener(new ActionListener() {//小数点监听事件
public void actionPerformed(ActionEvent e) {
if (!(plusClicked || minuClicked || multClicked || diciClicked)) {
add1 += ".";
output += ".";
} else {
add2 += ".";
output += ".";
}
label.setText(output);
}
});
p1.add(pointbutton);
pointbutton.setFont(new Font("楷体", Font.BOLD, 20)); //将小数点加到面板上
calbutton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (plusClicked) {
result = Double.valueOf(add1) + Double.valueOf(add2);
plusClicked = false;
add1 = "";
add2 = "";
}
if (minuClicked) {
result = Double.valueOf(add1) - Double.valueOf(add2);
minuClicked = false;
add1 = "";
add2 = "";
}
if (multClicked) {
result = Double.valueOf(add1) * Double.valueOf(add2);
multClicked = false;
add1 = "";
add2 = "";
}
if (diciClicked) {
result = Double.valueOf(add1) / Double.valueOf(add2);
diciClicked = false;
add1 = "";
add2 = "";
}
output += "=" + Double.toString(result);
label.setText(output);
output = "";
}
});
calbutton.setFont(new Font("楷体", Font.BOLD, 20));
p1.add(calbutton); //将等号加到面板上
getContentPane().add(p1); //把面板放到JFrame上
label.setBounds(20, 380, 200, 300);
label.setFont(new Font("黑体", Font.BOLD, 20));
getContentPane().add(label); //把标签放到窗口上
setSize(600, 680);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}//构造方法的末尾
}
public class Calculator {
public static void main(String[] args) {
Jisuan js = new Jisuan();
}
}
我们可以看到代码量是非常吓人的,在这里我们还有一种思路就是先把按钮依次按下的字符串放到一个文本框内,等按到等号按钮时进行监听事件的处理,判断文本框内是否有加减乘除这些运算符,如果有,则执行对应的操作。这种思路不用实现对每一个按钮的监听,会省下很大一部分功夫。哈哈由于是在敲完这个代码的时候才看到有一篇文章是关于这个思路的,具体可参考链接。
第一次写博客的经历总之就是太难了…欢迎大佬们评论指出问题,想在这条路上越走越远。