正在如火如荼地初学java基础,老师布置的小作业,供大家学习,功能甚少。只是有加减乘除等号。
import java.awt.Color;
import java.awt.Container;
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 java.util.LinkedList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class S3 extends JFrame implements ActionListener {
// 面板容器
private Container container;
// 计算器结果栏
private JLabel resultLabel;
// 数字键0-9
private JButton[] numbers;
// +,-,*,/ 四个操作符
private JButton add, sub, mul, div;
private JButton equal;
// 保存数据链
private LinkedList<String> datalist;
boolean isPressEqualButton = false;
public S3() {
// 绘制计算器的窗体大小
this.setTitle("计算器");
this.setSize(400, 250);
// 生成LinkedList的一个实例
datalist = new LinkedList<String>();
// 绘制panel容器的初始值
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
// 网格形式对容器的组件进行布置,创建具有指定行数和列数的网格布局。
panel1.setLayout(new GridLayout(1, 5));
panel2.setLayout(new GridLayout(4, 5));
// 第一个容器用来加载结果显示栏内容
resultLabel = new JLabel("0");
// resultLabel.setText("0");
// 设置水平居右对其
resultLabel.setHorizontalAlignment(JLabel.RIGHT);
resultLabel.setEnabled(false);// 不可编辑
panel1.add(resultLabel);
// 初始化设置数字按钮
numbers = new JButton[10];
for (int i = 0; i < 10; i++)
numbers[i] = new JButton("" + i);// 类型自动转换
add = new JButton("+");
sub = new JButton("-");
mul = new JButton("×");
div = new JButton("/");
equal = new JButton("=");
// 给数字键增加事件监听
for (int i = 0; i < 10; i++) {
numbers[i].addActionListener(this);
add.addActionListener(this);
sub.addActionListener(this);
mul.addActionListener(this);
div.addActionListener(this);
equal.addActionListener(this);
}
// 加入面板2
panel2.add(numbers[7]);// 增加第一行
panel2.add(numbers[8]);
panel2.add(numbers[9]);
panel2.add(add);
// 增加第二行
panel2.add(numbers[4]);
panel2.add(numbers[5]);
panel2.add(numbers[6]);
panel2.add(sub);
// 增加第三行
panel2.add(numbers[1]);
panel2.add(numbers[2]);
panel2.add(numbers[3]);
panel2.add(mul);
// 增加地四行
panel2.add(numbers[0]);
panel2.add(equal);
panel2.add(div);
// 加入所有面板到容器中
container = this.getContentPane();
container.add(panel1, "North");
container.add(panel2, "Center");
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});// 添加指定的窗口侦听器,以从此窗口接收窗口事件
}
public void actionPerformed(ActionEvent ae) {// 鼠标事件监听
JButton btn = (JButton) ae.getSource();
if (btn == numbers[0] || btn == numbers[1] || btn == numbers[2] || btn == numbers[3] || btn == numbers[4]
|| btn == numbers[5] || btn == numbers[6] || btn == numbers[7] || btn == numbers[8]
|| btn == numbers[9]) {
execNumber(btn);
} else if (btn == add || btn == sub || btn == mul || btn == div) {
execOperation(btn);
} else if (btn == equal) {
execResult();
}
}
// 执行运行结果
private void execResult() {
isPressEqualButton = true;
// 当列表长度为1或者2时,说明不能计算,保持数据不变
if (datalist.size() > 0 && datalist.size() < 3) {
String str = datalist.getFirst();
resultLabel.setText("" + Double.parseDouble(str));// 去除小数点后面多余追加的零
datalist.clear();// 清空列表数据
datalist.add(str);// 加入这个结果
} else if (datalist.size() == 3) {
double result = 0.0d;
int temp = 0;// 去掉结果为整数时所带的小数点
String num1 = datalist.getFirst();
String op = datalist.get(1);
String num2 = datalist.getLast();
if (op.equals("+")) {// +++++++++++++++
result = Double.parseDouble(num1) + Double.parseDouble(num2);
} else if (op.equals("-")) {// ---------------
result = Double.parseDouble(num1) - Double.parseDouble(num2);
} else if (op.equals("*")) {// **************
result = Double.parseDouble(num1) * Double.parseDouble(num2);
} else if (op.equals("/")) {//
result = Double.parseDouble(num1) / Double.parseDouble(num2);
}
datalist.clear();// 清空
datalist.add("" + result);// 使得结果加入列表中
temp = (int) result;
if (Double.isInfinite(result) == true)// 判断结果是否除数为零
{
datalist.clear();// 再次清空列表数据
resultLabel.setText("除数不能为零");// 回显错误结果
} else if (Double.isNaN(result) == true) {
datalist.clear();// 再次清空列表数据
resultLabel.setText("结果为定义");// 回显错误结果
} else if ((result - temp) == 0)
resultLabel.setText("" + temp);// 回显结果
else
resultLabel.setText("" + result);// 回显结果
}
}
// 执行操作功能
private void execOperation(JButton btn) {
String sign = null;
if (btn == add) {
sign = "+";
} else if (btn == sub) {
sign = "-";
} else if (btn == mul) {
sign = "*";
} else if (btn == div) {
sign = "/";
}
// 根据列表中元素的个数判断增加,列表元素为1时
if (datalist.size() == 1) {
datalist.add(sign);// 追加操作符
}
// 列表中元素为2,说明要替换现有的操作符
else if (datalist.size() == 2) {
datalist.set(1, sign);
}
// 列表中元素为3时,则取出前两个进行计算
else if (datalist.size() == 3) {
execResult();// 调用此方法执行,等号键为false
isPressEqualButton = false;
datalist.add(sign);
}
}
private void execNumber(JButton btn) {
int num = 0;
if (btn == numbers[0])
num = 0;
else if (btn == numbers[1])
num = 1;
else if (btn == numbers[2])
num = 2;
else if (btn == numbers[3])
num = 3;
else if (btn == numbers[4])
num = 4;
else if (btn == numbers[5])
num = 5;
else if (btn == numbers[6])
num = 6;
else if (btn == numbers[7])
num = 7;
else if (btn == numbers[8])
num = 8;
else if (btn == numbers[9])
num = 9;
// 列表为空的情况,加数到链表中,并设置等号键为false
if (datalist.size() == 0) {
datalist.add("" + num);
resultLabel.setText("" + num);
isPressEqualButton = false;
}
// 如果列表长度为1,取数合并结果
else if ((datalist.size() == 1) && (isPressEqualButton == false))// 说明还是第一个数据中的
{
String str = datalist.getFirst();
if (str.equals("0"))// 清除以0开头的数字
str = "";
String str0 = str.concat(String.valueOf(num));
// 覆盖列表中第一元素的内容
datalist.set(0, str0);
resultLabel.setText(str0);
} else if ((datalist.size() == 1) && (isPressEqualButton == true))// 表示已经是另外一个数据,上一个作废
{
datalist.set(0, String.valueOf(num));// 覆盖
resultLabel.setText("" + num);// 显示
isPressEqualButton = false;// 还原
}
// 列表为2,则加入第二个操作数
else if (datalist.size() == 2) {
datalist.add("" + num);
resultLabel.setText("" + num);
}
// 列表为3,表示继续输入的数据为第二操作数
else if (datalist.size() == 3) {
String str = datalist.getLast();
if (str.equals("0"))
str = "";
String strLast = str.concat("" + num);
// 设置第二操作数的更新
datalist.set(2, strLast);
resultLabel.setText(strLast);
}
}
public static void main(String args[]) {
S3 calculate = new S3();
calculate.setVisible(true);
}
}
java基础语言写简单计算器
最新推荐文章于 2024-07-02 20:55:21 发布