介绍
简单的说说这个小程序的难点,第一是窗口的绘制,第二是事件的添加,第三是计算使用的算法,这里要用到栈的特点。
效果展示
这个计算器可以实现n多个数字的加减乘除运算
绘制窗口使用的组件
JFrame:用来画窗口
JPanel:用来盛放组件
JTextArea:文字域组件,用来显示算式和结果
JButton:按钮组件
事件监听
没有监听事件,绘制好的窗口也只是个摆设,这里使用的方法是addActionListener,参数采用的是抽象的匿名内部类,要重写actionPerformed方法。
计算器的简单算法
依次取数字和运算符,如果是数字直接入栈,如果是运算符,判断优先级,如果是加减直接入栈,如果是乘除,数字出栈,和下一个数字运算后入栈,这样以来,栈中只存在单一的数字,或者是只用加减的运算式,这样处理就简单多了。
采用的设计模式
模板设计模式。为什么采用的是这个模式,因为绘制窗口是个固定的流程,所以采用这个模式,可以高度的复用。
斜体的是抽象类,箭头代表继承关系
#代表protected
-代表private
+代表public
习惯URL图的可以看明白。
代码
窗口绘制的抽象类
package com.gwx.www.frameprogram;
import javax.swing.*;
/**
* 基本模板
*
* @author alvinguo
* @date 2019-06-14
*/
public abstract class BasicFrame extends JFrame {
/**
* 设置组件样式
*/
protected abstract void setComponent();
/**
* 设置监听事件
*/
protected abstract void setListener();
/**
* 添加组件
*/
protected abstract void addComponent();
/**
* 设置窗口
*/
protected abstract void setFrameSelf();
/**
* 初始化窗口
* @param
* @return void
*/
public void initFrame() {
this.setComponent();
this.setListener();
this.addComponent();
this.setFrameSelf();
}
}
实现具体的窗口类
package com.gwx.www.frameprogram;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Stack;
/**
* 计算器窗口
*
* @author alvinguo
* @date 2019-06-14
*/
public class CalculatorFrame extends BasicFrame {
/**
* 错误码
*/
private final String EXP_ERROR = "EXPRESSION ERROR!";
/**
* 窗口的宽度
*/
private final int WIDTH = 300;
/**
* 窗口的高度
*/
private final int HEIGHT = 4