一、创建项目
- 以 Calculators 为项目名称 ,以com.xiaojun.calculators 为包名, 以 Calculators 为类名 创建项目
二、做一个计算机的页面出来![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4cc7fc235c11c134d4d60fe2d5b8bdd6.jpeg)
先列出需要的字段,和功能属性
-
super: 使用指定的标题创建一个最初不可见的新框架。
-
setLayout:设置此容器的布局管理器
-
setBounds:移动此组件并调整其大小。左上角的新位置由x和y指定,新大小由宽度和高度指定。
-
setHorizontalAlignment:设置文本的水平对齐方式,有效键为:
•JTextField.LEFT
•JTextField.CENTER
•JTextField.RIGHT
•JTextField.LEADING
•JTextField.TRAILING -
setEditable:设置指定的布尔值以指示此TextComponent是否应可编辑。状态更改时将触发PropertyChange事件(“可编辑”)。
-
setResizable:设置此框架是否可由用户调整大小
-
setBounds:移动此组件并调整其大小。左上角的新位置由x和y指定,新大小由宽度和高度指定。
-
setDefaultCloseOperation:设置当用户在此帧上启动“关闭”时默认情况下将发生的操作。必须指定以下选项之一:
•关闭时不执行任何操作(在WindowConstants中定义):不执行任何操作;要求程序在已注册的WindowListener对象的windowClosingmethod中处理操作。
•HIDE \u ON \u CLOSE(在WindowConstants中定义):在调用任何已注册的WindowListenerobjects后自动隐藏帧。
•DISPOSE ON \u CLOSE(在WindowConstants中定义):在调用任何已注册的WindowListenerobjects后自动隐藏和释放帧。
•EXIT ON \u CLOSE(在WindowConstants中定义):使用系统退出方法退出应用程序。仅在应用程序中使用。
默认情况下,该值设置为HIDE \u ON \u CLOSE。更改此属性的值会触发属性名为“defaultCloseOperation”的propertychange事件。
注意:当Java虚拟机(VM)中最后一个可显示的窗口被释放时,VM可能会终止。有关详细信息,请参阅AWT线程问题。 -
setVisible:根据参数b的值显示或隐藏此窗口。
-
setText :设置按钮的文本
-
代码展示:
package com.xiaojun.calculators;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class Calculators extends JFrame implements ActionListener {
private String[] KEYS = {"7","8","9","*","4","5","6","-","1","2","3","+","0","e","π","/","c","%",".","=","(",")","sqr","x*x"};
private JButton keys[]=new JButton[KEYS.length];
private JTextField resulText = new JTextField("0.0");
private String b= "";
public Calculators(){
super("计算机"); // 标题
/**
* 未设置Layout时,java默认为flowLayout布局的,设置为null即为清空布局管理器,
* 之后添加组件,常常是设置组件左上角坐标相对于容器左上角(0,0)的x,y值来确定组件
* 的位置,即使更改容器大小也不会改变位置。这种方式常常用于窗体大小固定的容器里
*/
this.setLayout(null);
resulText.setBounds(20,5,255,40); // 计算机输出框大小
resulText.setHorizontalAlignment(JTextField.RIGHT); // 输出文本位置右对齐
resulText.setEditable(false); // 用户不可编辑
this.add(resulText); // 添加到布局中
int x=20,y=55;
for(int i=0;i<KEYS.length; i++) {
keys[i] = new JButton();
keys[i].setText(KEYS[i]);
keys[i].setBounds(x,y,60,40);
if(x<215) {
x+=65;
}else {
x=20;
y+=45;
}
this.add(keys[i]);
}
for (int i = 0; i < KEYS.length; i++) {
keys[i].addActionListener(this);
}
this.setResizable(false); // 不可随意拉伸窗口
this.setBounds(500,200,300,400); // 设置窗口大小及位置
/**
* 设置一个默认的关闭操作,也就是你的JFrame窗口的关闭按钮,点击它时,退出程序。
* 不写的话,也是可以关闭窗口的,但是并没有结束程序的进程。写上的话,在关闭窗口的同时,
* 会结束这个进程
*/
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
/**
* 方法的意思是说数据模型已经构造好了,允许JVM可以根据数据模型执行paint方法开始画图并
* 显示到屏幕上了,并不是显示图形,而是可以运行开始画图了。这个方法和java多线程的start
* 方法有点异曲同工之妙,start方式是允许run方法运行了,start方法和setVisible方法很相似。
* 但为了安全起见,还是要把setVisible方法放到最后面。
*/
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
}
public static void main(String[] args) {
Calculators calculators =new Calculators();
}
}
以上只展示计算器界面,下面将进行用户点击按钮触发事件
三 、运算逻辑及事件交互
public void actionPerformed(ActionEvent e) {
String label = e.getActionCommand(); // 获得用户点击按钮的数值
if (label == "⬅") { // 回退
System.out.println(this.b.length());
if (this.b == null || this.b.length() == 0) {
this.b = "";
} else {
this.b = this.b.substring(0, this.b.length() - 1);
resulText.setText(this.b);
}
} else if (label == "c" || label == "=") { // 清除 与 结果
if (label == "c") {
this.b = "";
resulText.setText("");
} else {
String s[] = yunsuan(this.b); // 调用运算方法
String a = Result(s); // 调用结果方法
this.b = a;
resulText.setText(this.b); // 输出
// System.out.println(Arrays.toString(s));
}
} else if (label=="sqr")//sqr 按钮计算开方
{
String n=yunsuan2(this.b); // 调用开方方法
resulText.setText(n);
this.b=n;
} else if(label=="x*x")//x*x按钮实现某个数的平方
{
String m=yunsuan3(this.b);
resulText.setText(m);
this.b=m;
} else {
this.b = this.b + label;
resulText.setText(this.b);
}
}
public String[] yunsuan(String str) { // 运算方法 将用户输入的 计算式子 由中缀改为后缀返回
String s = "";
char a[] = new char[100]; // 创建接收运算符的数组
String jieguo[] = new String[100]; // 接收 由中缀 变 后缀式子 的数组
int top = -1, j = 0; // 创建指针
for (int i = 0; i < str.length(); i++) {
if ("0123456789.".indexOf(str.charAt(i)) >= 0) { // 判断是数字及小数的进
s = "";
for (; i < str.length() && "0123456789.".indexOf(str.charAt(i)) >= 0; i++) {
s = s + str.charAt(i); // 获取连续数字
}
i--;
System.out.println(" i = " + i + " s = " + s);
jieguo[j] = s; // 将获得的数字添加到数组
j++; // 下标向后移
} else if ("(".indexOf(str.charAt(i)) >= 0) { // 是左括号的进
top++;
a[top] = str.charAt(i); // 直接增加到运算附数组
} else if (")".indexOf(str.charAt(i)) >= 0) {
for (;;) { // 无限循环,遇到break跳出
if (a[top] != '(') {
jieguo[j] = a[top] + ""; // 添加 遇到左括号之前的所有运算符到 后缀数组
j++;
top--; // 指针回退
} else {
top--;
break;
}
}
} else if ("x÷%".indexOf(str.charAt(i)) >= 0) {
if (top == -1) { // 当运算符数组没有值时 直接将运算符赋值到运算符 a 数组
top++;
a[top] = str.charAt(i);
} else {
if ("x÷%".indexOf(a[top]) >= 0) {
jieguo[j] = a[top] + ""; // 优先执行 优先级高的运算符, 同级执行先添加的
j++;
a[top] = str.charAt(i); // 将后添加的运算符添加到 a 中
} else if ("(".indexOf(a[top]) >= 0) {
top++;
a[top] = str.charAt(i); // 同上
} else if ("+-".indexOf(a[top]) >= 0) {
top++;
a[top] = str.charAt(i); // 优先级低 直接添加
}
}
} else if ("+-".indexOf(str.charAt(i)) >= 0) {
if (top == -1) {
top++;
a[top] = str.charAt(i);
} else {
if ("x÷%".indexOf(a[top]) >= 0) {
jieguo[j] = a[top] + "";
j++;
a[top] = str.charAt(i);
} else if ("(".indexOf(a[top]) >= 0) {
top++;
a[top] = str.charAt(i);
} else if ("+-".indexOf(a[top]) >= 0) {
jieguo[j] = a[top] + ""; // 同级优先执行
j++;
a[top] = str.charAt(i);
}
}
System.out.println(Arrays.toString(a));
}
}
System.out.println(top);
for (; top != -1;) { // 将剩下的运算符都赋值到 jieguo 数组中
jieguo[j] = a[top] + "";
j++;
top--;
}
System.out.println(Arrays.toString(jieguo));
return jieguo; // 返回后缀表达式数组
}
public String Result(String str[]) { // 执行后缀表达式 返回运算结果
String result[] = new String[100]; // 创建保存结果的数组
int Top = -1;
for (int i = 0; str[i] != null; i++) {
System.out.println("+-x÷%".indexOf(str[i]));
if ("+-x÷%".indexOf(str[i]) < 0) { // 判断不为运算附的进 ,直接添加
Top++;
result[Top] = str[i];
} else {
double x, y, n;
// 获取数值
x = Double.parseDouble(result[Top]);
Top--;// 指针回退
y = Double.parseDouble(result[Top]);
Top--;
System.out.println("x = " + x+","+"y = " + y);
// 执行运算
if ("+".indexOf(str[i]) >= 0) {
n = y + x;
Top++;
result[Top] = String.valueOf(n);
} else if ("-".indexOf(str[i]) >= 0) {
n = y - x;
Top++;
result[Top] = String.valueOf(n);
} else if ("x".indexOf(str[i]) >= 0) {
n = y * x;
Top++;
result[Top] = String.valueOf(n);
} else if ("÷".indexOf(str[i]) >= 0) {
n = y / x;
Top++;
result[Top] = String.valueOf(n);
} else if ("%".indexOf(str[i]) >= 0) {
n = y % x;
Top++;
result[Top] = String.valueOf(n);
}
}
}
System.out.println("result = " + Arrays.toString(result));
return result[Top]; 返回最后结果
}
public String yunsuan2(String str) {
String result = "";
double a = Double.parseDouble(str), b = 0;
b = Math.sqrt(a);
result = String.valueOf(b);
return result;
}
public String yunsuan3(String str)
{
String result="";
double a=Double.parseDouble(str),b=0;
b=Math.pow(a, 2);
result=String.valueOf(b);
return result;
}