观察计算器,看它的布局,一点点剖析。
首先可以先分为三个大部分
布局
组件
功能实现
1.布局
第一个布局方面,一个计算器框架如下图:
我们可以看三种布局方式:
1.方位布局BorderLayout():上下两个大面板,上面板是文本域,下面板是按钮
2.流式布局FlowLayout():上面的那个面板再设为流式布局(自左向右,自上而下),一左一右
3.表格布局GridLayout(4, 4):4行4列放数字键
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)