package JavaAplication;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Calculation extends JFrame implements ActionListener {
private JTextField txfResult; //定义用于显示操作结果文本框
private JTextField txfM; //定义显示记忆的索引值的文本框
Double dM = 0d; //定义用于存储的数据
private boolean newDigital = true; //用于表示是否是输入的数的标志
private double d; //创建用于进行一元运算的变量
private double d1; //创建用于进行二元运算的前操作数
private double d2; //创建用于进行二元运算的后操作数
private int optionValue; //创建用于区别加减乘除运算符的变量
public Calculation(){
super("swing计算器实例");
/* 设置用于显示运算结果的文本框 */
txfResult = new JTextField("0", 30); //创建用于显示操作结果文本框
txfResult.setEditable(false); //设置不可编辑
txfResult.setBackground(Color.white); //设置文本框颜色
txfResult.setHorizontalAlignment(JTextField.RIGHT); //设置数组在文本框显示位置
JPanel ResultTextPanel = new JPanel(); //创建用于存放显示操作结果文本框的面板
ResultTextPanel.add(txfResult); //将显示操作结果文本框放入面板中
/*设置用于控制数字的数字键与显示记忆的索引值的文本框 */
txfM=new JTextField(2); //创建显示记忆的索引值的文本框
JButton b1 = new JButton("Backspace"); //创建 Backspace键
JButton b2 = new JButton("CE"); //创建 CE键
JButton b3 = new JButton("C"); //创建 C键
JPanel ControlPanel = new JPanel(); //创建用于存放面板的控制键
ControlPanel.setLayout(new GridLayout(1, 4, 2, 2)); //设置网格布局管理器
ControlPanel.add(txfM); //将显示记忆的索引值的文本框放入到面板中
ControlPanel.add(b1); //将Backspace键放入到面板中
ControlPanel.add(b2); //将CE键放入到面板中
ControlPanel.add(b3); //将C键放入到面板中
b1.addActionListener(this); //向Backspace键添加监听方法
b2.addActionListener(this); //向CE键添加监听方法
b3.addActionListener(this); //向C键添加监听方法
/* 设置数字和运算符键 */
String dcKey[] = { "MC","7", "8", "9", "/", "sqrt", "MR","4", "5", "6", "*", "%",
"MS","1", "2", "3", "-", "1/x","M+", "0", "+/-", ".", "+", "=" };
JPanel dcKeyPanel = new JPanel(); //创建用于存放数字和运算符键的面板
dcKeyPanel.setLayout(new GridLayout(4, 6, 2, 2)); //设置网格布局管理器
for (int i = 0; i < 24; i++) { //以数组的长度做为循环条件
JButton b = new JButton(dcKey[i]); //创建数字和运算符键按钮
dcKeyPanel.add(b); //将数字和运算符键按钮放入到布局管理器中
b.addActionListener(this); //向数字和运算符键添加监听方法
}
Container ct = this.getContentPane(); //窗体的内容面板对象
ct.setLayout(new BorderLayout()); //设置边界布局管理器
ct.add(ResultTextPanel, BorderLayout.NORTH); //将显示结果文本框放到窗体的上部
ct.add(ControlPanel, BorderLayout.CENTER); //将控制键放入到窗体中央
ct.add(dcKeyPanel, BorderLayout.SOUTH); //将数字和运算符键放入到窗体的下部
pack();//调整此窗口的大小
setVisible(true); // 设置窗体是否显示
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗体关闭的处理方式
}
public void actionPerformed(ActionEvent e) {
String s = (e.getActionCommand()); //返回与此动作相关的命令字符串
String str = txfResult.getText(); //获取文本框中的字符串
/*后退键*/
if (s.equals("Backspace")) {
String s1 = str ; //获取文本框中的字符串
txfResult.setText(s1.substring(0, s1.length() - 1));//截取最后一个数字
}
/*重置键*/
if (s.equals("CE") ) {
txfResult.setText("0"); // 把显示屏清零
newDigital = true; //将表示是否是新输入的数的标设置为true
}
/*清零键*/
if (s.equals("C")) {
txfResult.setText("0"); // 把显示屏清零
optionValue =0; //将用于表示运算符的变量设置为0
newDigital = true; //将表示是否是新输入的数的标设置为true
}
/*数字键*/
if (s.equals("0") || s.equals("1") || s.equals("2") || s.equals("3")
|| s.equals("4") || s.equals("5") || s.equals("6")
|| s.equals("7") || s.equals("8") || s.equals("9")) {
if (!newDigital)//判断是否是新数
txfResult.setText(str + s); //获取文本框中的字符串
else {
txfResult.setText(s); //设置文本框中的字符串
newDigital = false; //将是否为新数的标志设置为false
}
return;
}
/*小数点*/
if (s.equals(".")) {
if (txfResult.getText().indexOf(".") == -1){ //如果不存在小数点
/*判断数字是否以0开头*/
if (txfResult.getText().trim().startsWith("0")) {
txfResult.setText("0."); //设置文本框中的字符串
newDigital = false; //将是否为新数的标志设置为false
} else{
txfResult.setText(str + ".");//设置文本框中的字符串
}
}
return;
}
/* 表示数字正负符号+/- */
if (s.equals("+/-")) {
d = Double.parseDouble(str.trim()); //获取输入的数字
txfResult.setText(String.valueOf((-d))); //取得获取输入数字的相反数
return;
}
newDigital = true;
/*“+”号运算符*/
if (s.equals("+")) {
d1 = Double.parseDouble(txfResult.getText()); //获取前操作数的值
optionValue = 1; //设置运算符标志
}
/*“-”号运算符*/
if (s.equals("-")) {
d1 = Double.parseDouble(txfResult.getText()); //获取前操作数的值
optionValue = 2; //设置运算符标志
}
/*“*”号运算符*/
if (s.equals("*")) {
d1 = Double.parseDouble(txfResult.getText()); //获取前操作数的值
optionValue = 3; //设置运算符标志
}
/*“/”号运算符*/
if (s.equals("/")) {
d1 = Double.parseDouble(txfResult.getText()); //获取前操作数的值
optionValue = 4; //设置运算符标志
}
/* 等号运算符 */
if (s.equals("=")) {
d2 = Double.parseDouble(txfResult.getText()); //获取后操作数的值
/*根据运算符标志的不同值确定计算结果*/
switch (optionValue) {
case 1:
txfResult.setText(String.valueOf(d1 + d2));//加法运算
break;
case 2:
txfResult.setText(String.valueOf(d1 - d2));//减法运算
break;
case 3:
txfResult.setText(String.valueOf(d1 * d2));//乘法运算
break;
case 4:
if (d2!=0){
txfResult.setText(String.valueOf(d1 / d2));//除法运算
}else{
txfResult.setText("除数不能为0");//如果该值为0不能进行除法运算
return;
}
break;
}
optionValue = 0;//清空运算符
}
/*根号运算*/
if (s.equals("sqrt")) {
d = Double.parseDouble(txfResult.getText().trim()); //获取操作数的值
if (d >= 0) {
txfResult.setText(String.valueOf((Math.sqrt(d)))); //计算该值的平方根
} else {
txfResult.setText("负数不能计算平方根"); //如果该值为负数或者0不能计算平方根
}
/*倒数运算*/
} else if (s.equals("1/x")) {
d = Double.parseDouble(txfResult.getText().trim()); //计算该值的倒数
if (str.equals("0")) {
txfResult.setText("除数不能为0"); //如果该值为0不能计算倒数
} else {
txfResult.setText(String.valueOf((1 / d))); //计算该值求倒数
}
/*百分号运算符*/
} else if (s.equals("%")) {
txfResult.setText(String.valueOf((Double.parseDouble(str) / 100)));//计算该值的百分数
}
/*清除内存*/
if(s.equals("MC")){
txfM.setText(""); //将显示记忆的索引值的文本框设置为空
dM=0d;
newDigital = true; //将表示是否是新输入的数的标设置为true
}
/*/重新调用存储的数据*/
if(s.equals("MR")){
if(txfM.getText().trim()!=""){
txfResult.setText(""+dM); //显示存储的数据
}
}
/*存储显示的数据*/
if(s.equals("MS")){
dM=Double.parseDouble(txfResult.getText().trim()); //存储文本框中显示的数据
txfM.setText("M"); //将显示记忆的索引值的文本框显示M
}
/*将显示的数字与已经存储的数据相加*/
if(s.equals("M+")){
dM=dM+Double.parseDouble(txfResult.getText().trim()); //将显示的数字与已经存储的数据相加
}
}
public static void main(String[] args) {
new Calculation();
}
}
这个是一个小计算器
主要是参考书和网上的教学视频,做的第一个计算器的功能比较简单截图如下:
后来在网上找到教学视频,就按照他一步一步做的这个报告中的计算器,
这个计算器实现连加连减和开根号和一系列记忆功能。因为有参考的教程所以没有遇到困难,在学习期间查阅很多书看对该部分知识有了比较系统的掌握。