观察计算器,看它的布局,一点点剖析。
首先可以先分为三个大部分

布局

组件

功能实现

1.布局

第一个布局方面,一个计算器框架如下图:

awt java 设计计算器 java设计一个计算器的思路_java

我们可以看三种布局方式:

1.方位布局BorderLayout():上下两个大面板,上面板是文本域,下面板是按钮

awt java 设计计算器 java设计一个计算器的思路_java_02

2.流式布局FlowLayout():上面的那个面板再设为流式布局(自左向右,自上而下),一左一右

awt java 设计计算器 java设计一个计算器的思路_java_03


3.表格布局GridLayout(4, 4):4行4列放数字键

awt java 设计计算器 java设计一个计算器的思路_文本域_04

2.组件
观察都用了那些组件,
第一个窗体JFrame;
第二个容器(面板)JPanel;
第三个文本域JTextField;
第四个按钮JButton;

3.功能实现原理
number1 operate number2 = result结果值
比如1+1=2
operate是计算符号

(1)获取单击按钮上的值,判断用户单击的是什么,如果单击的是五个计算符号转到(2);如果单击的是这五个符号以外的其他按钮值,就转到(3),获得的若是“=”,则转到(4)执行

(2)把获取到的按钮值赋给定义好的operate中,然后把以后获得到的按钮值(除去计算符号)通过字符串拼接赋给number2在文本框上显示,然后找到对应的计算方法进行计算

(3)把获得到的按钮值通过字符串拼接赋给number1在文本框上显示,以后再次单击的是计算符号的就赋值给operate方法

(4)获取到的是=,则通过if 条件判断前面获取的operate值是哪个计算符号,然后把前面获取到的number1和number2进行计算

具体实现看如下代码:

package test;
//完整计算器的实现
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class testt {//定义所用到的变量
    JFrame jf;
    JTextField jtf;
    JButton[] jbs;
    JButton clear;

    String number1;
    String number2;
    String operate;
    String number="";
    double result;
    public testt() {
        //初始化窗体
        jf = new JFrame("计算器v1.1");
        jtf = new JTextField(15);//初始化文本域,最多15个数字
        clear = new JButton("清空");//初始化按钮
        jbs = new JButton[16];//初始化数组
        String str = "123+456-789*0.=/";
        for (int i = 0; i < jbs.length; i++) { //for循环对按钮进行初始化,存入数组之中
            jbs[i] = new JButton(str.charAt(i) + "");
            jbs[i].addActionListener(new ButClit());//给每个按钮add事件监听器
        }
        init();
        jf.setSize(300,300);
        jf.setVisible(true);
    }
        //init方法把组件add到窗体或者容器中相应的位置
    public void init(){
        //设置窗体布局为BorderLayout
        jf.setLayout(new BorderLayout());//计算器窗体布局set为方位布局模式
        JPanel jp1 = new JPanel();   //在这个布局中搞两块面板出来,一上一下
        JPanel jp2 = new JPanel();
        jp1.setLayout(new FlowLayout());//上面的那个面板再设为流式布局(自左向右,自上而下),一左一右
        jp1.add(jtf);  //在面板上添加文本域和清空按钮
        jp1.add(clear);
        jp2.setLayout(new GridLayout(4, 4));//下面的面板设置为表格布局,放置计算器上的数字按钮
        for (int i = 0; i < jbs.length; i++) {
            jp2.add(jbs[i]);  //把数字和计算符号按钮添加进4x4面板里
        }
        jf.add(jp1, BorderLayout.NORTH);//jp1容器放上面
        jf.add(jp2, BorderLayout.CENTER);//jp2容器放中间

    }
    //内部类
    class ButClit implements ActionListener {//创建ButClit类实现后面这个

        public void actionPerformed(ActionEvent e) {
            String text = ((JButton) e.getSource()).getText(); //获取按钮值
            //一般常见于Java 的awt, swing的事件处理里面,e是指一个事件,如ActionEvent,MouseMoveEvent等,它有一个事件发起者,用e.getSource()可以获得,但getSource()
            //返回的是Object类型(保持方法的通用性),所以如果已经知道是按钮产生的事件,可以用(JButton)e.getSourse()强制转换成JButton对象,这样就可以用JButton对象的方法了
            if (text.equals("=")) {  //如果获取到=,
                if(operate.equals("+")){
                    result=Double.parseDouble(number1)+Double.parseDouble(number2);//转为double类型计算
                    jtf.setText(result+"");//将结果显示到文本域中
                }else if(operate.equals("-")){
                    result=Double.parseDouble(number1)-Double.parseDouble(number2);//转为double类型计算
                    jtf.setText(result+"");//将结果显示到文本域中
                }else if(operate.equals("*")){
                    result=Double.parseDouble(number1)*Double.parseDouble(number2);//转为double类型计算
                    jtf.setText(result+"");//将结果显示到文本域中
                }else if(operate.equals("/")){
                    result=Double.parseDouble(number1)/Double.parseDouble(number2);//转为double类型计算
                    jtf.setText(result+"");//将结果显示到文本域中
                }
                number="";
            }else if (text.equals("+")) { //若获取的是+
                    operate="+";   //就对operate符号赋值为+
                    number=number+text; //将运算符号显示到文本域中
                    jtf.setText(number); //将number显示到文本域当中

                } else if (text.equals("-")) {
                    operate="-";
                    number=number+text;
                    jtf.setText(number);
                } else if (text.equals("*")) {
                    operate="*";
                    number=number+text;
                    jtf.setText(number);
                } else if (text.equals("/")) {
                    operate="/";
                    number=number+text;
                    jtf.setText(number);
                }else{
                    if(number1==null){
                        number1=text;
                    }else{
                        number2=text;
                    }
                    number=number+text;
                    jtf.setText(number);
                }

            }
        }



    //主函数,调用testt
public static void main(String[] args){
        testt t=new testt();
}





}

运行结果:(测试的5+9)

awt java 设计计算器 java设计一个计算器的思路_java_05