用 java 写一个计算器

一.  计算器图形界面:

由组件构成,例如Button,TextField等,特殊组件:容器,容器是组件的容器,各种组件包括容器可以通过add方法添加到容器中。显示在屏幕上的所有组件都包含在某个容器中。Swing提供了4种容器,JFrame,JApplet,JDialog,JWindow。JFrame是一个带有标题和控制按钮的独立窗口(最大最小化),JApplet被包含在浏览器窗口中。JDialog用于对话框,JWindow是一个不带有标题行和控制按钮的,所以用的很少。所以用JFrame作为容器。

二. 思路:用JFrame 作为容器,分两个面板JPanel,上面作显示部分放置JTextArea(设置为不可编辑,做显示用),下面放置各种按钮。
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.LayoutManager;
import java.awt.event.ActionListener;

import javax.swing.*;

public class Mycomputer extends JFrame{
	public Mycomputer() {
		super("Calculator");
		JPanel resultField = new JPanel();
		JPanel buttonField = new JPanel();
		JTextArea displayresultArea = new JTextArea("      ",1,10);
		JButton[] buttons=new JButton[16];
		JButton clear = new JButton("C");
		Font font = new Font("Arial Rounded MT Bold",Font.PLAIN,15);
		clear.setFont(font);
		displayresultArea.setFont(font);
		resultField.add(clear);
		resultField.add(displayresultArea);
		displayresultArea.setEditable(false);
		buttonField.setLayout(new GridLayout(4,4,3,3));
		String[] buttonnameStrings =  {"7","8","9","+","4","5","6","-","1","2","3","*","0",".","=","/"};
		for (int i = 0; i < 4; i++) {
			for (int j = 0; j < 4; j++) {
				buttons[i*4+j] = new JButton(buttonnameStrings[i*4+j]);
				buttonField.add(buttons[i*4+j]);				
			}
		}
		Container jframeContainer = this.getContentPane();
		jframeContainer.setLayout(new FlowLayout());
		jframeContainer.add(resultField);
		jframeContainer.add(buttonField);	
		setVisible(true);
		//setResizable(true);
	}
	public static void main(String[] args) {
		Mycomputer mc= new Mycomputer();
		mc.pack();
	}

}
布局前要用,获得ContentPane, 最有要setVisible(ture);可以.pack使格局紧凑。
Container jframeContainer = this.getContentPane();
三.JAVA 定义了很多事件类(event),如鼠标事件MouseEvent类,和代表键盘事件的KeyEvent类。当用户在组件上进行某种操作时候,事件处理系统便会生成一个事件类对象。

这个计算器,主要是鼠标单击按钮,事件处理系统生成一个代表此事件的ActionEvent事件类对象,操作不同,事件类对象不同。ActionEvent 这个接口只有一个方法,actionPerformed(),当出现ActionEvent事件的时候,该方法就会被调用。为了被接受并处理类事件,组件必须注册相应的时间处理程序,即时间的监听程序。处理计算器上的按钮的ActionEvent事件,需要为按钮JButton注册ActionEvent事件监听程序,每个组件都有如addXXXListener的方法。。

先定义一个实现了接口ActionListener的继承JFrame的类:

public class Mycomputer extends JFrame implements ActionListener{...};

再定义按钮:

JButton[] buttons=new JButton[16];//数字0-9,加减乘除,小数点
JButton clear = new JButton("C");//定义一个删除键

再对按钮注册事件监听程序:

clear.addActionListener(this);

buttons[i*4+j].addActionListener(this);

定义这样的方法,这样点击按钮就可以实现接口里的方法actionPerformed:

public void actionPerformed(ActionEvent e)

PS:对于按钮数组,可以用判断事件源 可以用 Object source=e.getSource();//判断事件源,并进行相应的处理;

四.其他细节:

1.'*',char 型用单引号;

2.return 可以只能跳出当前方法,不能中断程序;所以用红色的方法不能中断程序。break:用来跳出循环for, switch,if

<span style="background-color: rgb(255, 102, 102);">	public void judgezero(double second2)
	{
		if (second2 == 0)
		{
			init();
			displayresultArea.setText("can't be 0");
			return;
		}

	}</span>
<pre name="code" class="java"><span style="color:#330033;background-color: rgb(255, 102, 102);">case '/':
			judgezero(second);//!!return只跳出了judgezero这个方法,所以下面的语句还是要执行!! 
			second = first / second;
			displayresultArea.setText(String.valueOf(second));
			sign1=sign2;
			first = second;
			break;</span>

 改成: 

<span style="white-space:pre">	</span>public boolean judgezero(double second2)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>if (second2 == 0)
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>init();
<span style="white-space:pre">			</span>displayresultArea.setText("can't be 0");
<span style="white-space:pre">			</span>return true;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>else {
<span style="white-space:pre">			</span>return false;
<span style="white-space:pre">		</span>}


<span style="white-space:pre">	</span>}
case '/':
			//<span style="color:#ff6666;">judgezero(second);//!!return只跳出了judgezero这个方法,所以下面的语句还是要执行!! </span>
			if (judgezero(second)) {
				return;
			}
			second = first / second;
			displayresultArea.setText(String.valueOf(second));
			sign1=sign2;
			first = second;
			break;
3.把text里显示的数字转换成可计算的数据;把计算的数据显示在TEXT上

second=Double.parseDouble(displayresultArea.getText());
displayresultArea.setText(String.valueOf(second));


五.没完成 . 和 JFrame 外观 的问题。

代码:
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

import com.sun.xml.internal.ws.api.server.SDDocument;

public class Mycomputer extends JFrame implements ActionListener{//implements 实现接口,interface 接口
	JPanel resultField = new JPanel(); //面板,用来放显示结果的text 和 删除键
	JPanel buttonField = new JPanel();//面板,放数字键,符号键
	JTextArea displayresultArea = new JTextArea("",1,10);//用来显示计算结果
	JButton[] buttons=new JButton[16];//数字0-9,加减乘除,小数点
	JButton clear = new JButton("C");//定义一个删除键
	
	Font font = new Font("Arial Rounded MT Bold",Font.PLAIN,15);// Font 类表示字体,可以使用它以可见方式呈现文本
	boolean preisNum = false, preisSign = false;//判断上一次按的是数字或者是符号 
	double  first=0, second = 0;//first 存储上一个数字,second储存当前text显示的数字
	char sign1 = '\0',sign2='\0';//sign1 储存上一个符号,second储存当前按的符号
	public Mycomputer() {
		super("Calculator");
		clear.addActionListener(this);
		clear.setFont(font);
		displayresultArea.setFont(font);
		resultField.add(clear);
		resultField.add(displayresultArea);
		displayresultArea.setEditable(false);
		buttonField.setLayout(new GridLayout(4,4,3,3));
		String[] buttonnameStrings =  {"7","8","9","+","4","5","6","-","1","2","3","*","0",".","=","/"};
		for (int i = 0; i < 4; i++) {
			for (int j = 0; j < 4; j++) {
				buttons[i*4+j] = new JButton(buttonnameStrings[i*4+j]);
				buttonField.add(buttons[i*4+j]);
				buttons[i*4+j].addActionListener(this);
			}
		}
		Container jframeContainer = this.getContentPane();
		jframeContainer.setLayout(new FlowLayout());
		jframeContainer.add(resultField);
		jframeContainer.add(buttonField);	
		setVisible(true);
		setResizable(true);
	}
	public void init()
	{
		first=0;
		second = 0;
		sign1 = '\0';
		sign2='\0';
		displayresultArea.setText("");
		preisNum = false;
		preisSign = false;
	}
	public void actionPerformed(ActionEvent e)
	{
		Object source=e.getSource();//判断事件源,并进行相应的处理
		if (source ==clear) {
			init();
		}
		if (source==buttons[0]) {
			//showNumber("7");
			pressNumber("7");
		}
		if (source==buttons[1]) {
			pressNumber("8");
		}
		if (source==buttons[2]) {
			pressNumber("9");
		}
		if (source==buttons[3]) {
			preisNum = false;
			if (preisSign) {
				return;
			}
			preisSign =	true;
			second=Double.parseDouble(displayresultArea.getText());
			sign2='+';
			if (sign1=='\0') {
				sign1='+';
				first=second;				
				return;
			}
			else {
				switchsign1();
			}
			
		}
		if (source==buttons[4]) {
			pressNumber("4");
		}
		if (source==buttons[5]) {
			pressNumber("5");
		}
		if (source==buttons[6]) {
			pressNumber("6");
		}
		if (source==buttons[7]) {
			preisNum = false;
			if (preisSign) {
				return;
			}
			preisSign =	true;
			second=Double.parseDouble(displayresultArea.getText());
			sign2='-';
			if (sign1=='\0') {
				sign1='-';
				first=second;				
				return;
			}
			else {
				switchsign1();
			}
			
		}
		if (source==buttons[8]) {
			pressNumber("1");
		}
		if (source==buttons[9]) {
			pressNumber("2");
		}
		if (source==buttons[10]) {
			pressNumber("3");
		}
		if (source==buttons[11]) {
			preisNum = false;
			if (preisSign) {
				return;
			}
			preisSign =	true;
			second=Double.parseDouble(displayresultArea.getText());
			sign2='*';
			if (sign1=='\0') {
				sign1='*';
				first=second;				
				return;
			}
			else {
				switchsign1();
			}
		}
		if (source==buttons[12]) {
			pressNumber("0");
		}
		if (source==buttons[13]) {
			
		}
		if (source==buttons[14]) {
			preisNum = false;
			preisSign = false;
			second=Double.parseDouble(displayresultArea.getText());
			if (sign1=='\0') {
				first=second;				
				return;
			}
			else {
				switchsign1();
			}
			
		}
		if (source==buttons[15]) {
			preisNum = false;
			if (preisSign) {
				return;
			}
			preisSign =	true;
			second=Double.parseDouble(displayresultArea.getText());
			sign2='/';
			if (sign1=='\0') {
				sign1='/';
				first=second;				
				return;
			}
			else {
				switchsign1();
			}
		}
	}
	public void pressNumber(String n)
	{
		if (preisNum) {
			displayresultArea.append(n);
		}
		else {
			displayresultArea.setText(n);
		}
		preisNum = true;
		preisSign = false;
	}
	public boolean judgezero(double second2)
	{
		if (second2 == 0)
		{
			init();
			displayresultArea.setText("can't be 0");
			return true;
		}
		else {
			return false;
		}

	}
	public void switchsign1()
	{
		switch (sign1) {
		case '+':
			second = first + second;
			displayresultArea.setText(String.valueOf(second));
			sign1=sign2;
			first = second;
			break;
		case '-':
			second = first - second;
			displayresultArea.setText(String.valueOf(second));
			sign1=sign2;
			first = second;
			break;
		case '*':
			second = first * second;
			displayresultArea.setText(String.valueOf(second));
			sign1=sign2;
			first = second;
			break;
		case '/':
			//judgezero(second);//!!return只跳出了judgezero这个方法,所以下面的语句还是要执行!! 
			if (judgezero(second)) {
				return;
			}
			second = first / second;
			displayresultArea.setText(String.valueOf(second));
			sign1=sign2;
			first = second;
			break;
		default:
			break;
		}
		
	}
	public static void main(String[] args) {
		Mycomputer mc= new Mycomputer();
		mc.pack();
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

obession

觉得有用可以打赏咖啡一杯~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值