如何用java GUI写一个计算器

最近在学java GUI ,光看视频不动手是不行的,所以我打算做一个计算器练练手。

这是电脑自带的计算器,我们就以它为模板做一个简易的计算器

Java能图形化计算器 javagui界面设计计算器_输入框

而下面这个就是我们做出来的计算器最终的样子

Java能图形化计算器 javagui界面设计计算器_Java能图形化计算器_02

我们可以把计算器分为三个部分,计算器界面,监听事件,计算器运算程序,所以也就可以定义成三个类,但是这样写太过麻烦,所以我们把监听事件写成一个内部类,计算器运算程序写成一个函数,而计算器界面则是一个继承Frame的类。

Java能图形化计算器 javagui界面设计计算器_监听事件_03

一、用户界面

1、首先我们要知道需要哪些组件

我的这个计算器可以简单分为两个部分,按键区和输入输入区,所以我们需要两个Panel,按键区需要20个Button,输入框我们用TextField,而输出框则是一个Label

2、定义这些组件

Java能图形化计算器 javagui界面设计计算器_Java能图形化计算器_04

3、并对其初识化(即写入构造函数)

Java能图形化计算器 javagui界面设计计算器_输入框_05

4、有了组件之后我们下面就开始布局

设置窗口的大小和位置,设置全局字体,总体布局方式。此处注意,frame和panel都有其默认的布局方式,若要自定义布局,必须写上setLayout(null),否则自定义的大小和位置都将无效

Java能图形化计算器 javagui界面设计计算器_java_06

然后下面的操作就是搭积木了

上方的面板我们采用自定义布局方式,所以输入框输出库的大小和位置都要自己设置。设置面板背景颜色,输入框和输出库的字体,然后将其添加到面板中。

Java能图形化计算器 javagui界面设计计算器_监听事件_07

上方的面板搭完了,下面开始下方的面板,下方的面板搭建相对简单,直接采用表格布局方式即可。

设置面板的大小和位置,布局方式,背景颜色,然后将按钮按顺序(自左而右,自上而下)添加到面板中

Java能图形化计算器 javagui界面设计计算器_Java能图形化计算器_08

最后将两个面板添加到窗口Frame上就行了,并且设置Frame可见(默认不可见),大小不可调(默认可调)

Java能图形化计算器 javagui界面设计计算器_Java能图形化计算器_09

Java能图形化计算器 javagui界面设计计算器_监听事件_10

这样我们的界面就跟最终的一模一样了,只是点哪里都没有反应,关也关不掉。

二、监听事件

监听事件的作用就是,让界面能响应用户的操作。

1、设置程序关闭监听事件

这个比较简单,直接给Frame加上就行了

Java能图形化计算器 javagui界面设计计算器_输入框_11

2、接下来的是普通组件的监听事件,我们把它写成一个内部类

判断事件源头,如果是输入框那么就打印输入框的信息,如果是Backspace,那么就让输入框的文本减少一个,如果是empty,那么就清空输入框的内容,如果是=,那么就调用运算函数(这里下面会提到),运算输入框的内容,否则的话就让输入框的内容加上自己代表的字符,例如,输入框“5+”,此时点击9,那么输入框变成”5+9“。

Java能图形化计算器 javagui界面设计计算器_输入框_12

3、最后为所有按钮和输入框添加此事件监听器

Java能图形化计算器 javagui界面设计计算器_输入框_13

三、运算器程序

前面说过,我们把运算器程序写成一个函数,当点击**“=”**的时候调用函数,那么我们来讲讲这个函数

程序源码采用递归思想,此为程序源码,借鉴于 陈旭金-小金子,他讲的很详细,很透彻,建议去看看

public double parse(String content){
    try {
        //括号处理
        int indexStart=content.lastIndexOf('(');
        if (indexStart!=-1){
            int indexEnd=content.indexOf(')',indexStart);
            double d=parse(content.substring(indexStart+1,indexEnd));
            return parse(content.substring(0,indexStart)+d+content.substring(indexEnd+1));
        }
        //加法运算处理
        int index=content.indexOf('+');
        if(index!=-1){
            return parse(content.substring(0,index))+parse(content.substring(index+1));
        }
        //减法运算处理
        index=content.lastIndexOf('-');
        if(index!=-1){
            return parse(content.substring(0,index))-parse(content.substring(index+1));
        }
        //乘法运算处理
        index=content.indexOf('*');
        if(index!=-1){
            return parse(content.substring(0,index))*parse(content.substring(index+1));
        }
        //除法运算处理
        index=content.lastIndexOf('/');
        if(index!=-1){
            return parse(content.substring(0,index))/parse(content.substring(index+1));
        }
        return Double.parseDouble(content);//输出纯数字
    } catch (Exception e) {
        error=true;
        return 0;
    }
}