实现简易计算器,多则运算,记忆存储等记忆操作,Java期末大作业参考
Calculator类
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Calculator extends JFrame implements ActionListener, KeyListener {
/*——————————————————————————北面的控件—————————————————————————*/
private JPanel jp_north=new JPanel();//添加一个面板
private JTextField input_text=new JTextField();//添加一个文本框
/*——————————————————————————中间的控件—————————————————————————*/
private JPanel jp_center=new JPanel();//添加一个面板
private JButton[] btn=new JButton[24];//定义一个6行4列的按钮数组(全局变量方便调用)
private String shizi="";//用于保存存储计算公式,
private boolean dygfs=false;//判断第一个运算数是否为负数
private Double Memorizing_numbers=null;//用于保存记忆存储的数值,全局变量。
public Calculator() throws HeadlessException {
this.init();//初始化窗体函数调用
this.addNorthComponent();//北部面板设置函数调用
this.addCenterButton();//中间按钮面板设置函数的调用
}
public void init(){//窗体初始化方法
String imgpath="image/bt.png";//图标路径
try {
Image img= ImageIO.read(this.getClass().getResource(imgpath));//通过Image类获取该图片
this.setIconImage(img);//设置图标
} catch (IOException e) {
e.printStackTrace();
}
this.setTitle(Const.TITLE);//设置窗体边框标题
this.setSize(Const.FRAME_W,Const.FRAME_H);//窗体宽高设置
this.setLayout(new BorderLayout());//设置布局为边框布局,边框布局分东南西北中5个方位来添加控件
this.setResizable(false);//窗体大小固定不可改变
this.setLocation(Const.FRAME_x,Const.FRAME_y);//窗体位置(屏幕居中)
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗体关闭按钮关闭后退出程序
this.input_text.setHorizontalAlignment(JTextField.RIGHT);//文本框文字水平右对齐
}
public void addNorthComponent(){//添加北面控件部分
Font f=new Font("黑体",Font.BOLD,25);
this.input_text.setPreferredSize(new Dimension(380,50));//设置文本框宽高比
this.input_text.setFont(f);
jp_north.add(input_text);//北部面板中加入文本框
this.add(jp_north,BorderLayout.NORTH);//窗体中在北部方位加入北部面板
}
public void addCenterButton(){//添加中间按钮部分
this.jp_center.setLayout(new GridLayout(6,4));//6行4列的网格布局
String []anwz= {
"MR","M+","M-","MS",
"MC","CE","C","←",
"7","8","9","*",
"4","5","6","-",
"1","2","3","+",
"/","0",".","="
};//按钮文字数组
for (int i=0;i<24;i++){//初始化计算器键盘
btn[i]=new JButton(anwz[i]);
Font f=new Font("黑体",Font.BOLD,25);
btn[i].setFont(f);
if (i==0||i==4)
btn[i].setEnabled(false);//MR和MC按钮一开始禁用
switch (i){//记忆操作按钮的提示文字
case 0:btn[i].setToolTipText("记忆读取");
case 1:btn[i].setToolTipText("记忆加法");
case 2:btn[i].setToolTipText("记忆减法");
case 3:btn[i].setToolTipText("记忆存储");
case 4:btn[i].setToolTipText("记忆清除");
}
btn[i].addActionListener(this);
jp_center.add(btn[i]);//在面板中加入第i个按钮
}
this.add(jp_center,BorderLayout.CENTER);//将中部面板加入到窗体中,位置在中部方位
}
public static void main(String[] args) {
Calculator calculator=new Calculator();//定义一个窗体类
calculator.setVisible(true);//显示这个窗体对象
}
// private String FirstInput=null;//第一次输入的值
//
// private String operator=null;//运算操作符
@Override
public void actionPerformed(ActionEvent e) {//处理点击事件
String click_str=e.getActionCommand();//返回被点击的按钮的值,
if (".0123456789".indexOf(click_str)!=-1){//获取的是非操作符而是操作数
this.input_text.setText(input_text.getText()+click_str);//按钮数字显示在文本框内
this.input_text.setHorizontalAlignment(JTextField.RIGHT);//文本框文字水平右对齐
}else if(click_str.matches("[\\+\\-*/]{1}")){//摁到操作符按钮时
shizi+=this.input_text.getText().toString();
shizi+=click_str.toString();
this.input_text.setText("");//文本框清空
} else if (click_str.equals("MR")) {//记忆读取按钮事件功能
input_text.setText(Memorizing_numbers.toString());
} else if (click_str.equals("MC")) {//记忆清除按钮的功能
Memorizing_numbers=null;
btn[0].setEnabled(false);
btn[4].setEnabled(false);
} else if (click_str.equals("MS")) {//监听到点击记忆存储的按钮
btn[0].setEnabled(true);
btn[4].setEnabled(true);
Memorizing_numbers=Double.valueOf(input_text.getText());//获取文本框内当前的值,并将它记忆存储
} else if (click_str.equals("M+")) {//点击记忆加法事件的实现
Memorizing_numbers+=Double.valueOf(input_text.getText());//完成记忆加法操作
} else if (click_str.equals("M-")) {
Memorizing_numbers-=Double.valueOf(input_text.getText());//完成记忆减法操作
} else if (click_str.equals("←")) {//退格键点击事件
String chuli=input_text.getText();
if (input_text.getText().length()!=0){
chuli=chuli.substring(0,chuli.length()-1);
input_text.setText(chuli);
}
} else if (click_str.equals("=")) {
shizi+=this.input_text.getText().toString();
if(shizi.charAt(0)=='-'){
shizi=shizi.substring(1);
dygfs=true;
}
//数字切割器
StringTokenizer numSt=new StringTokenizer(shizi, "0123456789.");
//存放所有运算符
List<String> opers=new ArrayList<>();
while(numSt.hasMoreTokens()){
opers.add(numSt.nextToken());
}
//运算符切割器
StringTokenizer operSt=new StringTokenizer(shizi, "+-*/");
//存放所有运算数
List<Double> numbers=new ArrayList<>();
while(operSt.hasMoreTokens()){
numbers.add(Double.parseDouble(operSt.nextToken()));
}
if(dygfs){
numbers.add(0,numbers.remove(0)*-1);
}
for (int i = 0; i < opers.size(); i++) {
if(opers.get(i).equals("*")){
double result=numbers.remove(i)*numbers.remove(i);
numbers.add(i, result);
opers.remove(i);
i--;
}
else if(opers.get(i).equals("/")){
double result=numbers.remove(i)/numbers.remove(i);
numbers.add(i, result);
opers.remove(i);
i--;
}
}
for (int i = 0; i < opers.size(); i++) {
if (opers.get(i).equals("+")) {
double result = numbers.remove(i) + numbers.remove(i);
numbers.add(i, result);
opers.remove(i);
i--;
} else if (opers.get(i).equals("-")) {
double result = numbers.remove(i) - numbers.remove(i);
numbers.add(i, result);
opers.remove(i);
i--;
}
}
this.input_text.setText(numbers.get(0).toString());
shizi="";
dygfs=false;
}else if (click_str.equals("C")) {
shizi="";
dygfs=false;
this.input_text.setText("");
} else if (click_str.equals("CE")) {
if (input_text!=null){
input_text.setText("");
}
}
input_text.requestFocusInWindow();//文本框获得焦点、光标
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
char c=e.getKeyChar();
String key_str=String.valueOf(c);
if (".0123456789".indexOf(key_str)!=-1){//获取的是非操作符而是操作数
this.input_text.setText(input_text.getText()+key_str);//按钮数字显示在文本框内
this.input_text.setHorizontalAlignment(JTextField.RIGHT);//文本框文字水平右对齐
}
}
@Override
public void keyReleased(KeyEvent e) {
}
}
Const类
import java.awt.*;
public class Const {//常量类
public static final int FRAME_W=400;//窗体的宽高设置
public static final int FRAME_H=600;
public static final int SCREEN_W= Toolkit.getDefaultToolkit().getScreenSize().width;//获得屏幕的宽度
public static final int SCREEN_H=Toolkit.getDefaultToolkit().getScreenSize().height;//获取屏幕的高度
public static final int FRAME_x=(SCREEN_W-FRAME_W)/2;//窗体中心点定位的x轴与y轴位置;
public static final int FRAME_y=(SCREEN_H-FRAME_H)/2;
public static final String TITLE="计算器";
}