import java.awt.*;
import java.awt.Panel;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* @Author cc
* @create 2022/5/2 19:24
*/
public class calculate {
TextField tfResult;
Button btNum[], btOper[], btPoint, btEqual, btBack, btSqrt, btPingfang, btLifang;//button类型数据
//btNum是数,btoper是运算符
double num1 = 0, num2;//操作数
char oper;//操作符
boolean isNum;//代表数字标志位
public void init() {
Frame f;
tfResult = new TextField();//定义一个文本框
btNum = new Button[10];//数组对象
for (int i = 0; i <= 9; i++) {
btNum[i] = new Button(i + "");
btNum[i].setPreferredSize(new java.awt.Dimension(100, 100));
btNum[i].setFont(new Font("楷体", Font.CENTER_BASELINE, 20));
}//初始化数字按钮
btOper = new Button[4];//初始化运算符按钮
btOper[0] = new Button("+");
btOper[1] = new Button("-");
btOper[2] = new Button("*");
btOper[3] = new Button("/");
btPoint = new Button(".");
btEqual = new Button("=");
btBack = new Button("C");
btSqrt = new Button("Sqrt");
btPingfang = new Button("^2");
btLifang = new Button("^3");
f = new Frame("计算器");
f.setSize(400, 600);
//放置组件
f.add(tfResult, "North");
tfResult.setPreferredSize(new java.awt.Dimension(400, 100));
tfResult.setFont(new Font("宋体", Font.BOLD, 30));
Panel panel = new Panel();//定义一个面板
f.add(panel, "Center");//放到中间去
GridLayout gl = new GridLayout(5, 4);//五行四列
panel.setLayout(gl);//采用网格布局
//第一行
panel.add(btSqrt);
panel.add(btPingfang);
panel.add(btLifang);
panel.add(btBack);
//第二行
panel.add(btNum[7]);
panel.add(btNum[8]);
panel.add(btNum[9]);
panel.add(btOper[3]);//除法
//第三行
panel.add(btNum[4]);
panel.add(btNum[5]);
panel.add(btNum[6]);
panel.add(btOper[2]);//乘法
//第四行
panel.add(btNum[1]);
panel.add(btNum[2]);
panel.add(btNum[3]);
panel.add(btOper[1]);//减法
//第五行
panel.add(btNum[0]);
panel.add(btPoint);
panel.add(btEqual);
panel.add(btOper[0]);//加法
f.setVisible(true);
//注册监听
f.addWindowListener(new MyWinLis());//窗口监听关闭
//数字按钮注册监听
MyNumLis mnl = new MyNumLis();
for (int i = 0; i <= 9; i++)
btNum[i].addActionListener(mnl);
//操作符按钮注册监听
MyOperLis mol = new MyOperLis();//实例化监听对象
for (int j = 0; j <= 3; j++)
btOper[j].addActionListener(mol);
//等号按钮注册监听
MyEqualLis mel = new MyEqualLis();
btEqual.addActionListener(mel);
//清空按钮注册监听
MyBackLis mbl = new MyBackLis();
btBack.addActionListener(mbl);
//开根号按钮注册监听
MySqrtLis msl = new MySqrtLis();
btSqrt.addActionListener(msl);
//平方按钮注册监听
MyPingfangLis mpl = new MyPingfangLis();
btPingfang.addActionListener(mpl);
//立方按钮注册监听
MyLifangLis mll = new MyLifangLis();
btLifang.addActionListener(mll);
}
//定义监听器类
class MyNumLis implements ActionListener {//数字监听器
public void actionPerformed(ActionEvent e) {
String t = e.getActionCommand();//获取按钮的文本
String s = tfResult.getText();//获取文本框的文本
if (isNum == false)//如果当前缓冲没有数字
tfResult.setText(t);//设置文本框的文本
else//如果是已经有数字
tfResult.setText(s + t);//直接用拼接
isNum = true;//有数字了
}
}
class MyOperLis implements ActionListener {//操作符监听器
public void actionPerformed(ActionEvent e) {
if(e.getSource() == btOper[1] && tfResult.getText().equals("")){
tfResult.setText("-");
isNum = true;
}
num1 = Double.parseDouble(tfResult.getText());//先提取出当前文本框中的数字
oper = e.getActionCommand().charAt(0);//获取按钮的文本
isNum = false;//清空缓冲,准备下一个数字
}
}
class MySqrtLis implements ActionListener {//开根号监听器
public void actionPerformed(ActionEvent e) {
double t = Double.parseDouble(tfResult.getText());
if (t >= 0) {
tfResult.setText(Math.sqrt(t) + "");
} else {
tfResult.setText("负数不能开根号");
}
isNum = false;
}
}
class MyPingfangLis implements ActionListener {//平方监听器
public void actionPerformed(ActionEvent e) {
num1 = Double.parseDouble(tfResult.getText());
tfResult.setText(num1 * num1 + "");
}
}
class MyLifangLis implements ActionListener {//立方监听器
public void actionPerformed(ActionEvent e) {
num1 = Double.parseDouble(tfResult.getText());
tfResult.setText(num1 * num1 * num1 + "");
}
}
class MyEqualLis implements ActionListener {//等号监听器
public void actionPerformed(ActionEvent e) {
double result = 0;
isNum = false;
num2 = Double.parseDouble(tfResult.getText());//num2是按下加减乘除后的数字
switch (oper) {
case '+':
result = num1 + num2;
tfResult.setText(result + "");
break;
case '-':
result = num1 - num2;
tfResult.setText(result + "");
break;
case '*':
result = num1 * num2;
tfResult.setText(result + "");
break;
case '/':
if (num2 == 0) {
tfResult.setText("除数不能为0");
break;
}
result = num1 / num2;
tfResult.setText(result + "");
break;
}
}
}
class MyBackLis implements ActionListener {//重置
public void actionPerformed(ActionEvent e) {
tfResult.setText("");
isNum = false;
}
}
//关闭窗口
class MyWinLis extends WindowAdapter {
public void windowClosing(WindowEvent e) {
e.getWindow().setVisible(false);
e.getWindow().dispose();
System.exit(0);
}
}
public static void main(String[] args) {
new calculate().init();
}
}
利用Frame组件设计计算器
最新推荐文章于 2023-01-09 10:17:22 发布