用Java写一个简单的计算器

笔者今天要对用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这四个按钮功能未给予实现方法。另外,笔者也十分欢迎读者对笔者提出一些建议或者代码中的不足。

发布了1 篇原创文章 · 获赞 0 · 访问量 427

猜你喜欢

转载自blog.csdn.net/weixin_44849651/article/details/96301108