利用课余时间手写了一个简易的计算器
基本思路如下
1. 首先利用java–swing建立计算器的界面
2. 实现计算逻辑
首先定义了一个body类,整个逻辑都在这一个类中完成的,最开始是用两个类分别实现逻辑的,后来不知道怎么的一直报内存溢出的错误,所以干脆就在一个类中完成了。
计算器界面的代码如下
class body{
JFrame jframe = new JFrame();
Container con = jframe.getContentPane();
JButton b1 = new JButton("1");
JButton b2 = new JButton("2");
JButton b3 = new JButton("3");
JButton b4 = new JButton("4");
JButton b5 = new JButton("5");
JButton b6 = new JButton("6");
JButton b7 = new JButton("7");
JButton b8 = new JButton("8");
JButton b9 = new JButton("9");
JButton b0 = new JButton("0");
JButton b_multi = new JButton("*");
JButton b_division = new JButton("/");
JButton b_tip = new JButton(".");
JButton b_equal = new JButton("=");
JButton b_add = new JButton("+");
JButton b_cut = new JButton("-");
JButton temp = new JButton();
//-------------------------------------//
JPanel jp1 = new JPanel();
JPanel jp2 = new JPanel();
JTextField jtf = new JTextField(20);
body(){
jframe.setTitle("my_counter");
jframe.setVisible(true);
jframe.setDefaultCloseOperation(jframe.EXIT_ON_CLOSE);
jframe.add(jp1, BorderLayout.NORTH);
jframe.setResizable(false);
jframe.setLocation(800, 300);
jp1.add(jtf);
JButton bu[] = new JButton[] {b7, b8, b9, b_division, b4, b5, b6, b_multi, b1, b2, b3, b_add, b0, b_tip, b_equal, b_cut};
for(int i=0; i<bu.length; i++) {
bu[i].addActionListener(new jbAction());
jp2.add(bu[i]);
}
jp2.setLayout(new GridLayout(4, 4));
con.add(jp1, BorderLayout.NORTH);
con.add(jp2, BorderLayout.SOUTH);
jframe.pack();
}
这里是用swing自带的pack()方法自动适应界面填充组件大小,最后实现的计算器界面非常的小(有点看不下去),如果想自己设置各组件的大小,记得要把布局管理设置为null,并且根据界面自行调整坐标(麻烦啊)…
然后是计算逻辑
class body{
//创建字符串对象,用来使表达式能够完整的显示在文本框里
StringBuffer str = new StringBuffer("");
//实现运算逻辑所需要的变量
StringBuffer result=new StringBuffer(""); //用于存储左值(也是结果)和右值的累加值
StringBuffer right=new StringBuffer("");
double result2; //表达式左值,也是结果
double right2; //表达式右值
String bool; //存储运算符号
int k1 = 0; //k1=0时为左值,k1=1时为中间的运算符号值,k1=2时为右值
int k2 = 1; //在最后输出结果的时候不让监听方法里面进入循环语句,k=1时可进入,k=0时不可进入
class jbAction implements ActionListener{
JButton jb = new JButton();
@Override
public void actionPerformed(ActionEvent e) {
jb = (JButton)e.getSource();
if(k1 == 0 && k2 == 1){
if(jb.getText().equals("+") || jb.getText().equals("-") || jb.getText().equals("*") || jb.getText().equals("/")){
result2 = Double.parseDouble(result.toString());
k1 = 1;
}
result.append(jb.getText());
}
if (k1 == 1 && k2 == 1) {
bool = jb.getText();
k1 = 2;
}else if(k1 == 2 && k2 == 1){
if(jb.getText().equals("=")){
right2 = Double.parseDouble(right.toString());
k2 = 0;
}else if(jb.getText().equals("+") || jb.getText().equals("-") || jb.getText().equals("*") || jb.getText().equals("/")){
right2 = Double.parseDouble(right.toString());
fun();
bool = jb.getText();
right.delete(0, right.length());
}
if(jb.getText().equals("+") || jb.getText().equals("-") || jb.getText().equals("*") || jb.getText().equals("/")){
}else{
right.append(jb.getText());
}
}
str.append(jb.getText());
jtf.setText(str.toString());
//---------------------------//
if(jb.getText().equals("=")){
String result3 = Double.toString(fun());
jtf.setText(result3);
result.delete(0, result.length());
right.delete(0, right.length());
str.delete(0, str.length());
result2 = 0;
right2 = 0;
k1 = 0;
k2 = 1;
}
}
}
public double fun(){
if(bool.equals("+")){
result2 += right2;
}else if (bool.equals("-")) {
result2 -= right2;
}else if(bool.equals("*")){
result2 *= right2;
}else if(bool.equals("/")){
result2 /= right2;
}
return result2;
}
这里的监听器最开始是采用方法内部类写的,但是发现调用不了外部类里面定义的成员变量(不知道是方法不对还是怎么),然后就改用成员内部类写了
完整代码如下:
package my_counter;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class body{
JFrame jframe = new JFrame();
Container con = jframe.getContentPane();
JButton b1 = new JButton("1");
JButton b2 = new JButton("2");
JButton b3 = new JButton("3");
JButton b4 = new JButton("4");
JButton b5 = new JButton("5");
JButton b6 = new JButton("6");
JButton b7 = new JButton("7");
JButton b8 = new JButton("8");
JButton b9 = new JButton("9");
JButton b0 = new JButton("0");
JButton b_multi = new JButton("*");
JButton b_division = new JButton("/");
JButton b_tip = new JButton(".");
JButton b_equal = new JButton("=");
JButton b_add = new JButton("+");
JButton b_cut = new JButton("-");
JButton temp = new JButton();
//-------------------------------------//
JPanel jp1 = new JPanel();
JPanel jp2 = new JPanel();
JTextField jtf = new JTextField(20);
//创建字符串对象,用来使表达式能够完整的显示在文本框里
StringBuffer str = new StringBuffer("");
//实现运算逻辑所需要的变量
StringBuffer result=new StringBuffer(""); //用于存储左值(也是结果)和右值的累加值
StringBuffer right=new StringBuffer("");
double result2; //表达式左值,也是结果
double right2; //表达式右值
String bool; //存储运算符号
int k1 = 0; //k1=0时为左值,k1=1时为中间的运算符号值,k1=2时为右值
int k2 = 1; //在最后输出结果的时候不让监听方法里面进入循环语句,k=1时可进入,k=0时不可进入
//事件监听
class jbAction implements ActionListener{
JButton jb = new JButton();
@Override
public void actionPerformed(ActionEvent e) {
jb = (JButton)e.getSource();
if(k1 == 0 && k2 == 1){
if(jb.getText().equals("+") || jb.getText().equals("-") || jb.getText().equals("*") || jb.getText().equals("/")){
result2 = Double.parseDouble(result.toString());
k1 = 1;
}
result.append(jb.getText());
}
if (k1 == 1 && k2 == 1) {
bool = jb.getText();
k1 = 2;
}else if(k1 == 2 && k2 == 1){
if(jb.getText().equals("=")){
right2 = Double.parseDouble(right.toString());
k2 = 0;
}else if(jb.getText().equals("+") || jb.getText().equals("-") || jb.getText().equals("*") || jb.getText().equals("/")){
right2 = Double.parseDouble(right.toString());
fun();
bool = jb.getText();
right.delete(0, right.length());
}
if(jb.getText().equals("+") || jb.getText().equals("-") || jb.getText().equals("*") || jb.getText().equals("/")){
}else{
right.append(jb.getText());
}
}
//使表达式能够完整显示
str.append(jb.getText());
jtf.setText(str.toString());
//---------------------------//
if(jb.getText().equals("=")){
String result3 = Double.toString(fun());
jtf.setText(result3);
result.delete(0, result.length());
right.delete(0, right.length());
str.delete(0, str.length());
result2 = 0;
right2 = 0;
k1 = 0;
k2 = 1;
}
}
}
//构造方法,画出身体
body(){
jframe.setTitle("my_counter");
jframe.setVisible(true);
jframe.setDefaultCloseOperation(jframe.EXIT_ON_CLOSE);
jframe.add(jp1, BorderLayout.NORTH);
jframe.setResizable(false);
jframe.setLocation(800, 300);
jp1.add(jtf);
JButton bu[] = new JButton[] {b7, b8, b9, b_division, b4, b5, b6, b_multi, b1, b2, b3, b_add, b0, b_tip, b_equal, b_cut};
for(int i=0; i<bu.length; i++) {
bu[i].addActionListener(new jbAction());
jp2.add(bu[i]);
}
jp2.setLayout(new GridLayout(4, 4));
con.add(jp1, BorderLayout.NORTH);
con.add(jp2, BorderLayout.SOUTH);
jframe.pack();
}
public double fun(){
if(bool.equals("+")){
result2 += right2;
}else if (bool.equals("-")) {
result2 -= right2;
}else if(bool.equals("*")){
result2 *= right2;
}else if(bool.equals("/")){
result2 /= right2;
}
return result2;
}
}
public class counter{
public static void main(String[] args) {
body bd = new body();
}
}
虽然做出来了,但还是有一些不足,此计算器基本的算术要求都可以满足,但在多项式的表达式里没有乘除的优先级运算,整个表达式都是顺序执行QAQ,如有指点的意见,欢迎留言√