Java计算器实现原理及代码

Java计算器

要制作一个计算器,首先需要知道它由哪些部分组成。

在这里插入图片描述

从结构上来说,一个简单的图形界面,需要由界面组件、组件的事件监听器(响应各类事件的逻辑)和具体的事件处理逻辑组成。

整个代码结构如下图所示:

在这里插入图片描述
首先我们需要将界面中要用到的 UI 组件作为 Calculator 类的成员变量在一开始声明。在阅读代码之前,可以思考一下都要用到哪些 UI 组件,以及这些代码应当写在哪个位置等等。

一个计算器界面至少包括窗口、按钮和显示文本框。如下图,这是我们希望达到的效果。

界面实现的主要工作是创建各个界面组件对象,对其进行初始化,以及控制各组件之间的层次关系和布局。

在这里插入图片描述

(1)面板
这个计算器有两个 JPanel。

在这里插入图片描述

什么是 JPanel:JPanel 是一般轻量级容器。如上图所示,你可以将其理解为一个盛放其他 UI 组件的“篮子”。 JPanel 位于 javax.swing 包中,为面板容器,可以加入到 JFrame 中 , 它自身是个容器,也可以把其他 component (组件) 加入到 JPanel 中,例如 JButton、JTextArea、JTextField 等。

在这个项目中,两个 JPanel 分别对应这个计算器按键除 “Clear” 键外其他的键,另外一个面板则是输出栏跟 “Clear” 键,参考如下图。

在这里插入图片描述

同样,在书写本段代码时,你应当思考它应该放在哪个部分。如果不清楚,可以回到上面的代码结构中查看。

完整代码如下:

package CalculatorDemo;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Calculator extends JFrame implements ActionListener{
	//创建窗体North
	private  JPanel jp_north=new JPanel();
	private JTextField input_text=new JTextField();//创建输入框
	private JButton c_Btn=new JButton("c");//创建清除按钮
	//创建窗体Center
	private JPanel jp_center=new JPanel();
		
	public Calculator() throws HeadlessException{
		this.init();
		this.addNorthComponent();
		this.addCenterComponent();
	}
	
	//定义窗体属性
	public void init() {
		this.setTitle("计算器");//窗体标题
		this.setSize(300,300);//窗体大小
		//设置布局(setLayout窗体自定义布局;BorderLayout边界布局管理器把容器的的布局分为五个位置:CENTER、EAST、WEST、NORTH、SOUTH)
		this.setLayout(new BorderLayout());
		this.setResizable(false);//窗体是否调节大小
		this.setLocationRelativeTo(null);//窗体居中
		this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//关闭窗体
	}
	
	//定义窗体的North控件
	public void addNorthComponent() {
		this.input_text.setPreferredSize(new Dimension(230,30));//输入框大小
		//将控键加到North中(流式布局)
		jp_north.add(input_text);
		jp_north.add(c_Btn);
		
		//实现清除功能
		c_Btn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				input_text.setText("");
			}
		});
		//将jp_north加到BorderLayout.NORTH
		this.add(jp_north,BorderLayout.NORTH);
	}
	
	//定义窗体的Center控件
	public void addCenterComponent() {
		String btn_text="123+456-789*0.=/";//按顺序加入数字,符号
		this.jp_center.setLayout(new GridLayout(4, 4));//定义一个4*4的网格
		//一个格子
		for(int i=0;i<16;i++) {
			String temp=btn_text.substring(i,i+1);//substring截取字符
			JButton btn=new JButton();//按钮创建
			btn.setText(temp);//将截取的字符设置到按钮上
			if(temp.equals("+")||
					temp.equals("-")|| 
					temp.equals("*")||
					temp.equals("/")||
					temp.equals(".")||
					temp.equals("=")) {
				//设置符号属性
				btn.setFont(new Font("粗体",Font.BOLD,16));
				btn.setForeground(Color.RED);	
			}
			btn.addActionListener(this);//事件的监听
			jp_center.add(btn);//jp_center中加入按钮
		}
		//将jp_center加到BorderLayout.CENTER
		this.add(jp_center,BorderLayout.CENTER);
	}
	
	//事件的处理
	private String firstInput=null;
	private String operator=null;
	@Override
	public void actionPerformed(ActionEvent e) {
		String clickStr=e.getActionCommand();//获得事件的标签
		if(".0123456789".indexOf(clickStr)!=-1) {
			this.input_text.setText(input_text.getText()+clickStr);//得到连续的数
			this.input_text.setHorizontalAlignment(JTextField.RIGHT);//从右向左
			//JOptionPane.showMessageDialog(this, clickStr);
			}else if(clickStr.equals("+")||
				clickStr.equals("-")||
				clickStr.equals("*")||
				clickStr.equals("/")) {
					operator=clickStr;//记录操作符
					firstInput=this.input_text.getText();//记录第一次的数		
					this.input_text.setText("");//清除
			}else if(clickStr.equals("=")) {
				//valueOf将基本数据转为String
				Double a=Double.valueOf(firstInput);
				Double b=Double.valueOf(this.input_text.getText());
				Double result=null;
				switch(operator){
					case"+":
						result=a+b;
						break;
					case"-":
						result=a-b;
						break;
					case"*":
						result=a*b;
						break;
					case"/":
						if(b!=0) {
						result=a/b;
						}
						break;
				}
				this.input_text.setText(result.toString());
			}
	}
	
public static void main(String[] srgs) {
	Calculator calculator=new Calculator();
	calculator.setVisible(true);
	}
}
  • 5
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值