笔者今天要对用Java写计算器的过程进行一些总结。笔者认为,计算器的核心部分就是加减乘除运算的代码,这也是笔者这个小白在写代码过程中遇到的困难。笔者通过在博客上的查询和学习,解决了这个问题。
思路:运算时通过递归的思想得出结果。截图和代码如下。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Calculate extends JFrame implements ActionListener {
// 定义窗口所需组件
private Container c = getContentPane();
private JPanel p = new JPanel();
private JButton[] jbt = new JButton[24];
private JLabel jla1 = new JLabel("", SwingConstants.RIGHT);// 右对齐
private JLabel jla2 = new JLabel("0", SwingConstants.RIGHT);// 右对齐
private boolean total;// 定义total来检测小数点是否能加小数点
private String str1 = "", str2 = "";// 定义两个字符串
// 构造方法
Calculate() {
super("计算器");
// 设置布局管理器
p.setLayout(new GridLayout(5, 4));
// 用for循环创建出0~9这10个按钮的对象
for (int i = 0; i < 10; i++) {
jbt[i] = new JButton(String.valueOf(i));
}
// 创建另外14个按钮的对象
jbt[10] = new JButton(".");
jbt[11] = new JButton("+");
jbt[12] = new JButton("-");
jbt[13] = new JButton("×");
jbt[14] = new JButton("÷");
jbt[15] = new JButton("=");
jbt[16] = new JButton("%");
jbt[17] = new JButton("√");
jbt[18] = new JButton("x2");
jbt[19] = new JButton("1/x");
jbt[20] = new JButton("CE");
jbt[21] = new JButton("C");
jbt[22] = new JButton("±");
jbt[23] = new JButton("DE");
// 给按钮注册监听器
for (int i = 0; i < 24; i++)
jbt[i].addActionListener(this);
// 用for设置计算器按钮的样式
for (int i = 0; i < 24; i++) {
jbt[i].setPreferredSize(new Dimension(50, 50));
jbt[i].setFont(new Font("华文仿宋", 1, 30));
jbt[i].setBackground(Color.white);
}
// 设置标签内容样式
jla1.setFont(new Font("华文仿宋", 1, 30));
jla2.setFont(new Font("华文仿宋", 1, 50));
// 将计算器的24个按钮加入中间容器p中
p.add(jbt[20]);
p.add(jbt[21]);
p.add(jbt[22]);
p.add(jbt[23]);
p.add(jbt[7]);
p.add(jbt[8]);
p.add(jbt[9]);
p.add(jbt[14]);
p.add(jbt[4]);
p.add(jbt[5]);
p.add(jbt[6]);
p.add(jbt[13]);
p.add(jbt[1]);
p.add(jbt[2]);
p.add(jbt[3]);
p.add(jbt[12]);
p.add(jbt[10]);
p.add(jbt[0]);
p.add(jbt[15]);
p.add(jbt[11]);
// 向容器按规定布局管理器添加组件
c.add(jla1, BorderLayout.NORTH);
c.add(jla2, BorderLayout.CENTER);
c.add(p,BorderLayout.SOUTH);
setBounds(200, 200, 350, 420);// 设置窗口位置和大小
setVisible(true);// 设置窗口可视化
setResizable(false);// 设置窗口不可改变
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
// 实现接口中的方法
public void actionPerformed(ActionEvent e) {
// 实现输入数字按钮功能
if ((JButton) e.getSource() == jbt[0] || (JButton) e.getSource() == jbt[1] || (JButton) e.getSource() == jbt[2]
|| (JButton) e.getSource() == jbt[3] || (JButton) e.getSource() == jbt[4]
|| (JButton) e.getSource() == jbt[5] || (JButton) e.getSource() == jbt[6]
|| (JButton) e.getSource() == jbt[7] || (JButton) e.getSource() == jbt[8]
|| (JButton) e.getSource() == jbt[9] || (JButton) e.getSource() == jbt[10]
|| (JButton) e.getSource() == jbt[22]) {
NumberButton(e);
}
// 实现输入符号按钮功能
if ((JButton) e.getSource() == jbt[11] || (JButton) e.getSource() == jbt[12]
|| (JButton) e.getSource() == jbt[13] || (JButton) e.getSource() == jbt[14]) {
CalculaterButton(e);
}
// 实现=按钮功能
if (e.getActionCommand().equals("="))
Calculater();
// 实现C按钮功能
if (e.getActionCommand().equals("C"))
CButton(e);
// 实现CE按钮功能
if (e.getActionCommand().equals("CE"))
CEButton(e);
// 实现DE按钮功能
if (e.getActionCommand().equals("DE"))
DEButton(e);
}// end actionPerformed
数字和符号输入按钮的实现方法
// 定义数字输入方法
private void NumberButton(ActionEvent e) {
// 小数点按钮的功能(判断)小数点是否只出现一次
if (e.getActionCommand().equals(".") && (total == false)) {
if (jla2.getText() == "0") {
str2 = "0.";
jla2.setText(str2);
total = true;
} else {
str2 += e.getActionCommand();
jla2.setText(str2);
total = true;
}
}
// 按0按钮
if (e.getActionCommand().equals("0")) {
// 如果jla2为0
if (jla2.getText().equals("0")) {
str2 = "0";
jla2.setText(str2);
} else {
str2 += e.getActionCommand();
jla2.setText(str2);
}
}
// 1~9这9个按钮的功能
if ((JButton) e.getSource() == jbt[1] || (JButton) e.getSource() == jbt[2] || (JButton) e.getSource() == jbt[3]
|| (JButton) e.getSource() == jbt[4] || (JButton) e.getSource() == jbt[5]
|| (JButton) e.getSource() == jbt[6] || (JButton) e.getSource() == jbt[7]
|| (JButton) e.getSource() == jbt[8] || (JButton) e.getSource() == jbt[9]) {
if (jla2.getText().equals("0")) {
str2 = e.getActionCommand();
jla2.setText(str2);
} else {
str2 += e.getActionCommand();
jla2.setText(str2);
}
}
// ±按钮的功能
if (e.getActionCommand().equals("±")) {
// 正数变负数
if ((java.lang.Double.valueOf(jla2.getText())) > 0)
jla2.setText("-" + jla2.getText());
// 负数变正数
else if ((java.lang.Double.valueOf(jla2.getText())) < 0)
jla2.setText(jla2.getText().replace("-", ""));
}
}// end NumberButton
// 定义运算符号的实现方法
private void CalculaterButton(ActionEvent e) {
str1 += jla2.getText() + e.getActionCommand();
jla1.setText(str1);
jla2.setText("0");
total = false;
}// end CalculaterButton
// =按钮的功能实现方法
private void Calculater() {
jla1.setText("");
str1 += jla2.getText();
double result = parse(str1);
jla1.setText(str1 + "=");
jla2.setText(Double.valueOf(result) + "");
str1 = str2 = "";
}// end Calculater
计算方法(递归思想):把运算符号前的数一个一个取出来
private double parse(String str1) {
int index = str1.indexOf("+");
if (index != -1)
return parse(str1.substring(0, index)) + parse(str1.substring(index + 1));
index = str1.lastIndexOf("-");
if (index != -1)
return parse(str1.substring(0, index)) - parse(str1.substring(index + 1));
index = str1.indexOf("×");
if (index != -1) {
return parse(str1.substring(0, index)) * parse(str1.substring(index + 1));
}
index = str1.indexOf("÷");
if (index != -1) {
return parse(str1.substring(0, index)) / parse(str1.substring(index + 1));
}
return Double.parseDouble(str1);
}
其他键功能
// DE按钮的功能实现方法
private void DEButton(ActionEvent e) {
if (jla2.getText().length() == 1) {
str2 = "0";
jla2.setText(str2);
} else {
str2 = DeteleString(jla2.getText());
jla2.setText(str2);
}
}// end DEButton
// 删除方法
private String DeteleString(String text) {
String a = "";
char[] ch = jla2.getText().toCharArray();
for (int i = 0; i < jla2.getText().length() - 1; i++)
a += ch[i];
if (a.contains("."))
total = true;
else
total = false;
return a;
}// end DeteleString
// CE按钮的功能实现方法
private void CEButton(ActionEvent e) {
str2 = "0";
jla2.setText(str2);
total = false;
}// end CEButton
// C按钮的功能实现方法
private void CButton(ActionEvent e) {
str2 = "0";
str1 = "";
total = false;
jla1.setText(str1);
jla2.setText(str2);
}// end CButton
}// end Calculate
主方法
public class CalculateDemo {
public static void main(String[] args) {
new Calculate();
}// end main
}// end CalculateDemo
public void setPreferredSize(Dimension preferredSize)此方法用于设置此组件的首选大小。如果 preferredSize 为 null,则要求 UI 提供首选大小。
Dimension(int width, int height) 此构造方法用于构造一个 Dimension,并将其初始化为指定宽度和高度(可为负数)。
总结:以上便是笔者对写代码过程的总结,其中的不足就是16~19这四个按钮功能未给予实现方法。另外,笔者也十分欢迎读者对笔者提出一些建议或者代码中的不足。