Java实现简单的可保存计算计算过程的计算器

使用Java中的用户图形界面设计实现计算器,本计算器可以实现简单的加减乘除功能和保存计算过程。

计算器设计思想:

1、分父子两个窗口,父窗口为计算器的相关界面,子窗口用于显示保存的计算过程。

2、计算器在运行时只会出现父窗口,在父窗口中有历史按钮,点击历史按钮调用出子窗口。

 3、在计算器项目下创建一个文本文件history,将计算过程写存进此文件中,在调出子窗口时,子窗口进行读取此文件中的计算过程内容用于显示给用户。

相关代码:

       父窗口:

package 计算器;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;


@SuppressWarnings("serial")
public class Calculator extends JFrame implements ActionListener {
// 属性
	JTextField txtResult;
	boolean firstDigit = true;// 用于判断是否是数字
	String operator = "=";// 先初始化为等号,等到执行相应运算时再更改
	boolean operateValidFlag = true;// 判断除数是否为0
	double resultNum = 0.0;// 可以暂存目前的最终结果
	double resultString;//用来打印每次计算后的结果
// 方法

	public Calculator() {
		setTitle("计算器");
		setSize(240, 270);
		setResizable(true);//用户可以调整窗口大小
		setLocationRelativeTo(null);//将窗口设置在屏幕中间
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		Container contentPane = this.getContentPane();//构造一个容器
		contentPane.setLayout(new BorderLayout(1, 5));//此容器的布局为边界布局
		JPanel pnlNorth = new JPanel();
		JPanel pnlCenter = new JPanel();

		pnlNorth.setLayout(new BorderLayout());//北部面板的布局为边界布局
		pnlCenter.setLayout(new GridLayout(4, 4, 3, 3));//中间面板的布局是网格布局

		Font font = new Font("Times Roman", Font.BOLD, 20);//设置字体

		contentPane.add(BorderLayout.NORTH, pnlNorth);
		contentPane.add(BorderLayout.CENTER, pnlCenter);

		txtResult = new JTextField();
		txtResult.setFont(font);
		txtResult.setEnabled(false);//此组件不可相应,即这个文本框不能被用户操作
		JButton btnhs = new JButton();// 添加一个历史记录的按钮
		Icon history = new ImageIcon("lishi.png");// 添加一个照片
		btnhs.setIcon(history);// 给按钮添加图片
		btnhs.setBorderPainted(false);// 不绘制边框
		btnhs.setBorder(null);// 设置边框为空
		btnhs.setFont(font);//设置字体
		btnhs.addActionListener(new ActionListener() {// 历史按钮的监听器

			@Override
			public void actionPerformed(ActionEvent e) {// 事件触发后打开子窗口
				new ChildJfarme();

			}
		});

		pnlNorth.add(BorderLayout.CENTER, txtResult);
		pnlNorth.add(BorderLayout.EAST, btnhs);

		String[] captions = { "7", "8", "9", "/", "4", "5", "6", "*", "1", "2", "3", "-", "0", ".", "=", "+", };
		for (int i = 0; i < captions.length; i++) {
			JButton btn = new JButton(captions[i]);
			btn.setFont(font);
			pnlCenter.add(btn);
			btn.addActionListener(this);

		}
		

	}

	public static void main(String[] args) {
		JFrame frame = new Calculator();
		frame.setVisible(true);
//写文件

		File file = new File("history");// 创建一个文件
		try {
			PrintStream printStream = new PrintStream(file);//使用file文件创建一个打印流
			System.setOut(printStream);//重新分配,将控制台的内容打印出进文件中
		} catch (FileNotFoundException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}

//对按钮进行的反应
	public void actionPerformed(ActionEvent event) {

		String label = event.getActionCommand();
		System.out.print(label);//将按键符打印出来

		if ("0123456789.".indexOf(label) >= 0) {//indexof方法是将所给字符进行比较,若所给元素中不包含则返回-1
//无论整数还是小数都一起提取出来
			handleNumber(label);

		} else {
//将当前要执行的运算的运算符赋给operator
			handleOperator(label);
		}
		if (label.equals("=") == true) {

			System.out.println(resultString);
		}
	}

//提取数字
	void handleNumber(String key) {
		if (firstDigit) {
			txtResult.setText(key);// 在文本框中显示数字的字符串
		} else if ((key.equals(".")) && (txtResult.getText().indexOf(".") < 0)) {//只有当点击小数点和显示半中没有小数点时才执行

			txtResult.setText(txtResult.getText() + ".");// 在文本框中显示小数数字
		} else if (!key.equals(".")) {

			txtResult.setText(txtResult.getText() + key);// 在文本框中显示整数数字的字符串
		}
		firstDigit = false;// 当第一个数字显示完之后,即可重置为false
	}

//进行运算
	void handleOperator(String key) {
		if (operator.equals("/")) {
//判断除数是否为0
			if (getNumberFromText() == 0.0) {

				operateValidFlag = false;// 判断除数是否为零
				txtResult.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("=")) {

			resultNum = getNumberFromText();

		}

		if (operateValidFlag) {
			long t1;
			double t2;
			t1 = (long) resultNum;
			t2 = resultNum - t1;
			if (t2 == 0) {
				txtResult.setText(String.valueOf(t1));//将long型转换成string类型
			} else {
				txtResult.setText(String.valueOf(resultNum));//将double型转换成string型
			}
		}
		operator = key;
		firstDigit = true;
		operateValidFlag = true;

		resultString = getNumberFromText();
	}

	double getNumberFromText() {
		double result = 0;
		try {
			result = Double.valueOf(txtResult.getText()).doubleValue();// 把String转化成Double类型的对象,并求double的原始值

		} catch (NumberFormatException e) {
		}
		return result;

	}
}

子窗口:

package 计算器;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;



public class ChildJfarme  {
	JTextArea textArea;
	public ChildJfarme(){
	JFrame Cframe=new JFrame("历史记录");
	Cframe.setSize(240, 270);
	textArea=new JTextArea();//添加一个文本区用于显示读取的文本
	textArea.setLineWrap(true);

	JScrollPane jScrollPane=new JScrollPane(textArea);//创建轻量级组件的可滚动视图以便存放文本区
	jScrollPane.setSize(220, 270);
	Cframe.add(jScrollPane);
	Cframe.setLocationRelativeTo(null);//窗口显示在屏幕中央
	Cframe.setVisible(true);//窗口显示
	read();
	}

	private void read() {
		// TODO 自动生成的方法存根
		File f =new File("history");
		FileReader fr=null;
		try {
			fr=new FileReader(f);
			char ch[]=new char[1024];
			@SuppressWarnings("unused")
			int count;
			while ((count=fr.read(ch))!=-1) {
				String s =new String(ch);
				textArea.append(s);
			}
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}
}

运行结果图:

此计算器只是可以进行简单计算 ,不可以进行科学计算,并在设计上还有一些不足。

  • 7
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值