编程语言
首页 > 编程语言> > Java计算器

Java计算器

作者:互联网

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;//JPanel的使用
import javax.swing.JTextField;//文本框




public class calculator extends JFrame implements ActionListener
{//这里的ActionListener接口是在java.awt.event.ActionEvent

//定义一大堆成员变量……
// 标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字
private boolean firstDigit = true;
// 计算的中间结果。
private double resultNum = 0.0;
// 当前运算的运算符
private String operator = "=";
// 操作是否合法
private boolean operateValidFlag = true;
// 计算结果文本框 
private JTextField resultText = new JTextField("0");

private final String [] KEYS = {"7","8","9","+","4","5","6","-","1","2","3","*","0","=",".","/"}; 
//字符串是String,字符数组是char 

private JButton keys[] = new JButton[KEYS.length];
/** 计算器上的功能键的按钮 */

public calculator()
{
JFrame f = new JFrame("Calculator");
//JTextField text_one = new JTextField ();//表示的是计算后的结果显示

//以下两行显示的是本程序作者信息
JTextField text_two = new JTextField ("Definition:Calculator");
JTextField text_three = new JTextField ("Author: 刘申");

//以下三行设置的是文本框内容不可编辑
resultText.setEditable(false);
text_two.setEditable(false);
text_three.setEditable(false);

// 文本框中的内容采用右对齐方式
resultText.setHorizontalAlignment(JTextField.RIGHT);

//设置窗口f的布局为BorderLayout型
//Sets the layout manager for this container.
f.setLayout(new BorderLayout());
//设置两个面板容器,用来装按键和作者信息
JPanel  panel = new JPanel();
JPanel panel2= new JPanel();
//设置容器布局类型
panel.setLayout(new GridLayout(4,4));

//设置窗口大小
this.setSize(300,300);
//设置窗口出现的位置
this.setLocation(400, 300);

for (int i = 0; i < KEYS.length; i++) 
{
keys[i] = new JButton(KEYS[i]);
panel.add(keys[i]);

//设置面板的背景色为绿色
panel.setBackground(Color.GREEN);


//设置按钮键的背景色为蓝色
keys[i].setForeground(Color.blue);
}

/* 请和上面的那个代码相区别
//为每个按键赋上”标签“
for(int i=0;i<16;i++)
{
Button key = new Button(KEYS[i]);
//将按钮添加到面板容器中
panel.add(key);
}
*/



panel2.add(text_two);
panel2.add(text_three);

//设置各个板块出现在窗口中的位置
this.add(resultText,BorderLayout.NORTH);
this.add(panel,BorderLayout.CENTER);
this.add(panel2,BorderLayout.SOUTH);

// 都使用同一个事件侦听器,即本对象。本类的声明中有implements ActionListener
for(int i=0;i<16;i++)
{
//为按钮对象添加监听器事件
keys[i].addActionListener(this);
//这里的keys是计算器上键的按钮,而不是那个字符数组“KEYS”
//这里的this 是用来干嘛的呢?为什么是this而不能是别的呢---->
/* addActionListener
public void addActionListener(ActionListener l)
添加指定的动作侦听器,以接收发自此按钮的动作事件。当用户在此按钮上按下或释放鼠标时
发生动作事件。如果 l 为 null,则不抛出任何异常,也不执行任何动作。
*来自java doc文档
**/
}

//this.setVisible(true);
//这里就不使用this.visiable(true)这条语句了,在后面直接使用cal.visiable(true)来表示窗口可见
}

/*
* 以下程序是用来处理监听事件*/
public void actionPerformed(ActionEvent e) 
{
//返回按钮表面上的文本信息方法getActionCommand()
String label = e.getActionCommand();

//验证输出按钮的反馈信息
System.out.println("按钮信息为"+e.getActionCommand());

//将按钮上的信息反馈到文本框当中
//resultText.setText(label);
//如果将这个信息添加到文本框中,则会引起重复

if ("0123456789".indexOf(label) >= 0) 
{
// 用户按了数字键或者小数点键
System.out.println("数字为"+e.getActionCommand());
System.out.println("进入数字处理区");
handleNumber(label);
}
else
{ // 用户按了运算符键
handleOperator(label);
System.out.println("输入的字符是"+e.getActionCommand());
System.out.println("进入字符处理区");
}
}


private void handleNumber(String key) 
{
if (firstDigit) {
// 输入的第一个数字,将其填入到文本框中
resultText.setText(key);

else  {
// 如果输入的不是小数点,则将数字附在结果文本框的后面
resultText.setText(resultText.getText() + key);
}
// 以后输入的肯定不是第一个数字了
firstDigit = false;
}



private void handleOperator(String key)
{
if (operator.equals("/"))
{
// 除法运算
// 如果当前结果文本框中的值等于0
if (getNumberFromText() == 0.0) {
// 操作不合法
operateValidFlag = false;
resultText.setText("除数不能为零");

else
{
resultNum /= getNumberFromText();
}
} else if (operator.equals("1/x")) {
// 倒数运算
if (resultNum == 0.0) {
// 操作不合法
operateValidFlag = false;
resultText.setText("零没有倒数");
} else {
resultNum = 1 / resultNum;
}
} else if (operator.equals("+")) {
// 加法运算
resultNum += getNumberFromText();
} else if (operator.equals("-")) {
// 减法运算
resultNum -= getNumberFromText();
} else if (operator.equals("*")) {
// 乘法运算
resultNum *= getNumberFromText();
} else if (operator.equals("sqrt")) {
// 平方根运算
resultNum = Math.sqrt(resultNum);
} else if (operator.equals("%")) {
// 百分号运算,除以100
resultNum = resultNum / 100;
} else if (operator.equals("+/-")) {
// 正数负数运算
resultNum = resultNum * (-1);
} else if (operator.equals("=")) {
// 赋值运算
resultNum = getNumberFromText();
}
if (operateValidFlag) {
// 双精度浮点数的运算
long t1;
double t2;
t1 = (long) resultNum;
t2 = resultNum - t1;
if (t2 == 0) {
resultText.setText(String.valueOf(t1));
} else {
resultText.setText(String.valueOf(resultNum));
}
}
// 运算符等于用户按的按钮
operator = key;
firstDigit = true;
operateValidFlag = true;
}


/**
* 从结果文本框中获取数字
*/
private double getNumberFromText() 
{
double result = 0;
try {
result = Double.valueOf(resultText.getText()).doubleValue();
} catch (NumberFormatException e) {
}
return result;
}



public static void main(String []args)
{
calculator cal = new calculator();
cal.setVisible(true);
//用来退出计算器界面程序
cal.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}

标签:resultText,计算器,文本框,else,resultNum,new,operator,Java
来源: https://blog.51cto.com/lawsonabs/2951739