用Java写一个简单的计算器

简单的计算器虽然简单,但对于初学入门者还是一次很好的实操训练,能帮助大家更快地掌握java图形用户界面编程的相关知识。虽然现实并没有几个人用java写图形界面 。或许是老师独门改造的题目,我一开始百度找到的用Java写一个简单的计算器(应该是浏览量最高的,好嫉妒呀)看似图形界面复杂丰富(主要原因是不符合我们老师的要求o(╥﹏╥)o),实则只用到了ActionListener的监听器接口,以下小编的计算器分别设置了ActionListener、ItemListener监听器接口,可以更加丰富全面地认识理解监听器接口的方法。

一、思路流程

问题1:如何获得外界输入端的信息?
经尝试(百度验证其它复杂计算器),发现编译出的程序框能自动感应到用户端输入的信息,所以只用保证原文本框为空,且设置好后来的运算函数
问题2:将JTextField获取的内容组合?
构造加减乘除函数,参数分别设置为text1.getText()、text2.getText()
问题3:等号之后的actionPerformed触发机制?
设置全局变量flag,根据不同flag的值,调用相应的运算函数
问题4:当除数为0时,进入哪个监听器?如何能监听到?
通过在除法运算的构造函数,对参数text2.getText()处理,当其为0时,flag=4,然后在ActionPerformed()函数进行处理。函数参数分别表示:对话框相对的中心位置主体信息标题信息类型
JOptionPane.showMessageDialog(null, "除数不能为0", "系统提示", JOptionPane.ERROR_MESSAGE)

二、代码过程

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class J_SimpleComputer extends JFrame {
	int flag = -1;
	String output = "0";
	JFrame f = new JFrame("简单的计算器");
	Container c = f.getContentPane();
	JTextField text1 = new JTextField("", 5);
	JTextField text2 = new JTextField("", 5);
	JTextField text3 = new JTextField("", 5);
	//text3.setText("78");
	JComboBox jcb = new JComboBox();
	JButton b = new JButton("=");
	String ope[] = { "+", "-", "*", "/" };

	J_SimpleComputer() {

		c.setLayout(new FlowLayout());
		c.add(text1);
		int i;
		for (i = 0; i < 4; i++)
			jcb.addItem(ope[i]);
//对JComboBox添加监听器
		c.add(jcb);
		c.add(text2);
		jcb.addItemListener(new setOeration_Act());
//对JButton添加监听器
		c.add(b);
		c.add(text3);
		b.addActionListener(new getOeration_Act());
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(300, 200);
		f.setVisible(true);
	}
	public String add(String x, String y) {
		int x1 = Integer.parseInt(x);
		int y1 = Integer.parseInt(y);
		output = String.valueOf(x1 + y1);
		return output;
	}
	public String subtract(String x, String y) {
		int x1 = Integer.parseInt(x);
		int y1 = Integer.parseInt(y);
		output = String.valueOf(x1 - y1);
		return output;
	}
	public String multiply(String x, String y) {
		int x1 = Integer.parseInt(x);
		int y1 = Integer.parseInt(y);
		output = String.valueOf(x1 * y1);
		return output;
	}
	public String divide(String x, String y) {
		int x1 = Integer.parseInt(x);
		int y1 = Integer.parseInt(y);
		if (y1 == 0)
			flag = 4;
		else
			output = String.valueOf(x1 / y1);
		return output;
	}
	class setOeration_Act implements ItemListener {
		public void itemStateChanged(ItemEvent e) {
			if(e.getStateChange() == ItemEvent.SELECTED) {
				// setText将对象确定为XXX字符串
				if(e.getItem()=="+") flag = 0;
				if(e.getItem()=="-") flag = 1;
				if(e.getItem()=="*") flag = 2;
				if(e.getItem()=="/") flag = 3;
				
				System.out.println(flag);
			}
		}
	}
	class getOeration_Act implements ActionListener {
		public void actionPerformed(ActionEvent e) {// 对话框相对的中心位置,主体信息,标题,信息类型
			if(e.getActionCommand()=="=") {
			if (flag == 0)
				text3.setText(add(text1.getText(), text2.getText()));
			if (flag == 1)
				text3.setText(subtract(text1.getText(), text2.getText()));
			if (flag == 2)
				text3.setText(multiply(text1.getText(), text2.getText()));
			if (flag == 3)
				text3.setText(divide(text1.getText(), text2.getText()));
			if (flag == 4)
				JOptionPane.showMessageDialog(null, "除数不能为0", "系统提示", JOptionPane.ERROR_MESSAGE);
		}
		}
	}

	public static void main(String argv[]) {
		new J_SimpleComputer();
}
	}

三、执行结果

基本图形界面

乘法运算

除法运算

四、心得体会

以下文本是小编肺腑之言,包含debug时复杂的心理活动,希望对大家有所借鉴帮助

  • 在理清上述代码的基本流程后,我写的两个监听机制迟迟没能生效,这让我抓狂了很久。我又仔细对照网上的运算数和运算符全由JButton写的复杂计算器代码如何用Java编写一个简单的计算器,对比actionPerformed(),感觉应该是itemStateChanged()监听器这段代码出了问题。通过验证,在该代码块里输出flag,发现一直是初始值而且每次监听到的都是两个重复结果。
  • 接着开始认真查找ItemListener中的itemStateChanged(ItemEvent e)的使用方法,该方法的调用与itemState有关,item的状态有两个,Selected和deSelected,当改变下拉框中被选中的项时,其实是触发了两次事件,第一次时上次被选中的项由Selected改变为deSelected,第二次是本次被选中的项由deSelected改为Selected,所以itemStateChanged(ItemEvent e)事件中的代码要被执行两次。
  • 解决方法很简单,就是if(e.getStatChanged()==ItemEvent.SELECTED){//要执行的代码},简单修改后,又出现了其它一些小bug,不过很快就能成功运行了。

最后,终于可以开开心心地交作业啦啦啦(~ ̄▽ ̄)~

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值