package com.java1234.chap09.sect09;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
/**
* 做一个简易的计算器
* @author Administrator
* @see JFrame
* @see ActionListener
*/
//创建计算器SwingTest3类,实现ActionListener接口
public class SwingTest3 extends JFrame implements ActionListener {
/**
* Serial Version UID
*/
private static final long serialVersionUID = -169068472193786457L;
/**
* 建一个类来 关闭窗口
* @author Administrator
*
*/
private class WindowCloser extends WindowAdapter {
//重写父类的关闭窗体的方法
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
}
int i;
//这里定义要操作的对应的数字或符号的按钮
private final String[] str = { "7", "8", "9", "/", "4", "5", "6", "*", "1",
"2", "3", "-", ".", "0", "=", "+" };
//创建按钮 这边定义一个 JButton按钮数组
JButton[] jbuttons=new JButton[str.length];
//传入str的长度,就说明要建几个按钮了
//创建一个结果按钮 或者取消按钮,用于输出结果 ,或者取消结果
JButton reset = new JButton("CE");
//创建一个结果文本框
JTextField display = new JTextField("0");
/**
* 创建一个无参数构造方法,它的作用是可以用来初始化,
* 也就是和类名相同的方法,即构造方法
* 在new 一个类对象的时候 会调用该构造方法
*/
public SwingTest3(){
super("这是一个简易计算器");
//建窗体的标题
//添加一个容器 按 4*4网格布局
JPanel panel1 = new JPanel(new GridLayout(4, 4));
//这个组件用于添加按钮的
// panel1.setLayout(new GridLayout(4,4));
//依次添加按钮到面板中
for (i = 0; i < str.length; i++) {
jbuttons[i] = new JButton(str[i]);
panel1.add(jbuttons[i]);
}
//再创建面板的时候直接设置边缘布局,这个组件用于添加文本框结果集的
JPanel panel2 = new JPanel(new BorderLayout());
// panel2.setLayout(new BorderLayout());这边是创建后再设置边缘布局,效果一样
panel2.add("Center",display);
//往面板里添加文本框组件
panel2.add("East", reset);
//添加结果集
// JPanel panel3 = new Panel();
getContentPane().setLayout(new BorderLayout());
//获取内容面板 设置边缘布局
getContentPane().add("North",panel2);
//把文本框结果集面板放在上面
getContentPane().add("Center",panel1);
//把按钮组件部分 放在中间
// 添加每个数字 或者按钮
for(int i=0;i0){
handleNumber(label);
}else
handleOperator(label);
}
//判断第一个输入的数据?
boolean isFirstDigit = true;
/**
* Number handling. 在文本框里面显示我们要点击的数据
* @param key the key of the button.
*/
private void handleNumber(String key) {
if (isFirstDigit){
//一开始肯定是 true
display.setText(key);
}
//则文本框显示 这个数据
else if ((key.equals(".")) && (display.getText().indexOf(".") < 0)){
display.setText(display.getText() + ".");
}
else if (!key.equals(".")){
display.setText(display.getText() + key);
//输入第二个数字或以后的数字
}
isFirstDigit = false;
//输完第一个值后,置为false
}
/**
* 重置计算器 ce按钮
* 点击这个ce 按钮的时候 ,
* 我们把 isFirstDigit operator display 这三个地方重置为初始值
*/
private void handleReset() {
display.setText("0");
isFirstDigit = true;
//数据输完我们重置为true
operator = "=";
}
double number = 0.0;
//设置计算的初始值为0.0
String operator = "=";
//计算加"+ - * / = ."
/**
*
* Handling the operation.
* @param key pressed operator's key.
* 设计+ - * / = .的监听事件
* @param key
*/
private void handleOperator(String key) {
if (operator.equals("+"))
number += Double.valueOf(display.getText());
else if (operator.equals("-"))
number -= Double.valueOf(display.getText());
else if (operator.equals("*"))
number *= Double.valueOf(display.getText());
else if (operator.equals("/"))
number /= Double.valueOf(display.getText());
else if (operator.equals("="))
number = Double.valueOf(display.getText());
display.setText(String.valueOf(number));
operator = key;
isFirstDigit = true;
}
public static void main(String[] args) {
//定义一个匿名对象 会默认调用里面的构造方法,SwingTest3()
new SwingTest3();
}
}
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31369373/viewspace-2125029/,如需转载,请注明出处,否则将追究法律责任。