实现思路
- 初始化窗口
- 实现计算器页面布局
- 添加各组件
- 添加数字按钮监听事件
- 添加操作符按钮监听事件
- 添加等号按钮监听事件
- 添加监听事件实现复位
计算器截图
代码
导入包
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
主函数
public class Main {
public static void main(String[] args) {
CalputerFrame calputerFrame=new CalputerFrame();
calputerFrame.setFrame();
}
}
界面布局
public class CalputerFrame extends Frame{
String logic; //操作符状态
String num1="",num2=""; //存储两位操作数
//定义
Panel panel1 = new Panel(new GridLayout(1,1));
Panel panel2 = new Panel(new GridLayout(4,4));
JTextField jTextField = new JTextField("0");
Button button0 = new Button("0");
Button button1 = new Button("1");
Button button2 = new Button("2");
Button button3 = new Button("3");
Button button4 = new Button("4");
Button button5 = new Button("5");
Button button6 = new Button("6");
Button button7 = new Button("7");
Button button8 = new Button("8");
Button button9 = new Button("9");
Button buttonA = new Button("+");
Button buttonB = new Button("-");
Button buttonC = new Button("*");
Button buttonD = new Button("/");
Button buttonE = new Button("=");
Button buttonF = new Button("C");
public void setFrame(){
//窗口初始化
Frame frame = new Frame("Calculation");
frame.setBounds(100,100,300,250); //设置位置及大小
frame.setLayout(null); //布局
frame.setVisible(true); //设置可见
//panel
/*
页面分为上下两大部分
输入输出框TextField
按钮部分
*/
panel1.setBounds(30,40,240,30);
panel2.setBounds(10,90,280,150);
frame.add(panel1); //添加面板
frame.add(panel2);
//TextField
jTextField.setHorizontalAlignment(SwingConstants.RIGHT); //右对齐
jTextField.setEditable(false); //设置只读
panel1.add(jTextField);
//数字区
/*
按钮区域使用GridLayout布局
实现 4*4 网格页面
*/
//设置颜色
buttonF.setForeground(Color.blue);
buttonE.setForeground(Color.blue);
buttonA.setForeground(Color.red);
buttonB.setForeground(Color.red);
buttonC.setForeground(Color.red);
buttonD.setForeground(Color.red);
//添加按钮
panel2.add(buttonF);
panel2.add(button0);
panel2.add(buttonE);
panel2.add(buttonA);
panel2.add(button1);
panel2.add(button2);
panel2.add(button3);
panel2.add(buttonB);
panel2.add(button4);
panel2.add(button5);
panel2.add(button6);
panel2.add(buttonC);
panel2.add(button7);
panel2.add(button8);
panel2.add(button9);
panel2.add(buttonD);
//数字监听
NumActionListener numListener = new NumActionListener(this);
button0.addActionListener(numListener);
button1.addActionListener(numListener);
button2.addActionListener(numListener);
button3.addActionListener(numListener);
button4.addActionListener(numListener);
button5.addActionListener(numListener);
button6.addActionListener(numListener);
button7.addActionListener(numListener);
button8.addActionListener(numListener);
button9.addActionListener(numListener);
//操作符监听
OpActionListener opListener = new OpActionListener(this);
buttonA.addActionListener(opListener);
buttonB.addActionListener(opListener);
buttonC.addActionListener(opListener);
buttonD.addActionListener(opListener);
//等号监听
buttonE.addActionListener(new EqActionListener(this));
//复位监听
buttonF.addActionListener(new ResterListener(this));
//关闭窗口
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
数字按钮监听事件
public class NumActionListener implements ActionListener {
CalputerFrame calputerFrame;
public NumActionListener(CalputerFrame calputerFrame){
this.calputerFrame=calputerFrame;
}
/**
* 数字按钮监听事件
* 1.获取按钮label 即相应数字
* 2.拼接字符串
* 3.保存该数并显示在TextField中
*/
@Override
public void actionPerformed(ActionEvent e) {
Button button = (Button) e.getSource();
String btntext = button.getLabel();
//第2位操作数
if (calputerFrame.logic!=null&&!"".equals(calputerFrame.logic)) {
calputerFrame.num2=calputerFrame.num2+btntext ; //拼接字符串
int number = Integer.parseInt(calputerFrame.num2); //转换为数字
calputerFrame.jTextField.setText(Integer.toString(number)); //显示TextField
}
//第1位操作数
else {
calputerFrame.num1= calputerFrame.num1+btntext ;
calputerFrame.jTextField.setText(calputerFrame.num1);
int number = Integer.parseInt(calputerFrame.num1);
calputerFrame.jTextField.setText(Integer.toString(number));
}
}
}
操作符按钮监听事件
public class OpActionListener implements ActionListener {
CalputerFrame calputerFrame;
public OpActionListener(CalputerFrame calputerFrame) {
this.calputerFrame = calputerFrame;
}
/**
* 操作符按钮监听事件
* 1.logic保存获取的操作符
*/
@Override
public void actionPerformed(ActionEvent e) {
Button button = (Button) e.getSource();
calputerFrame.logic = button.getLabel(); //获取并修改logic 保存操作符
}
}
等号按钮监听事件
public class EqActionListener implements ActionListener {
CalputerFrame calputerFrame;
public EqActionListener(CalputerFrame calputerFrame) {
this.calputerFrame = calputerFrame;
}
/**
* 等号监听事件
* 1.将操作数转换为数字
* 2.判断运算符并作出运算
* 3.设置TextField 显示结果
* 4.清空操作符及操作数
*/
@Override
public void actionPerformed(ActionEvent e) {
if (calputerFrame.num1!=null&&!"".equals(calputerFrame.num1)&&calputerFrame.num2!=null&&!"".equals(calputerFrame.num2)) {
int number1 = Integer.parseInt(calputerFrame.num1); //两数不为空时转换为数字
int number2 = Integer.parseInt(calputerFrame.num2);
String sum = "";
switch (calputerFrame.logic) {
case "+":sum=number1+number2+"";break;
case "-":sum=number1-number2+"";break;
case "*":sum=number1*number2+"";break;
case "/":sum= (double) number1 / (double) number2 +"";break; //(double)强制类型转换
default:break;
}
calputerFrame.jTextField.setText(sum); //TextField显示结果
calputerFrame.logic=""; //清空状态
calputerFrame.num1="";
calputerFrame.num2="";
}
}
}
复位按钮监听事件
public class ResterListener implements ActionListener {
CalputerFrame calputerFrame;
public ResterListener(CalputerFrame calputerFrame) {
this.calputerFrame = calputerFrame;
}
/**
* 复位监听事件
* 1.TextField显示“0”
* 2.设置各状态为初始状态
*/
@Override
public void actionPerformed(ActionEvent e) {
calputerFrame.jTextField.setText("0");
calputerFrame.logic="";
calputerFrame.num1="";
calputerFrame.num2="";
}
}
// 代码仅作为本人记录,仅供参考。
// 如有任何问题欢迎指正,有任何建议或分歧在不发生争吵的情况下欢迎提出。
// 语法等仅代表个人习惯,非专业人士,不习惯可选择看下一篇文章或仅参考思路,勿喷。
// 感谢您的阅读。