利用Java的GUI制作简单的计算器

利用Java的GUI制作简单的计算器

import java.awt.*;
​
import java.awt.event.*;
​
import javax.swing.*;
​
public class JCalculator extends JFrame implements ActionListener {
​
private class WindowCloser extends WindowAdapter {
​
•      public void windowClosing(WindowEvent we) {
​
•          System.exit(0);
​
•      }
​
•    }
​
•    int i;
​
•    //  final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
​
•    private final String[] str = { "7", "8", "9", "/", "4", "5", "6", "*", "1",
​
•          "2", "3", "-", ".", "0", "=", "+" };
​
•    // 创建16个按钮
​
•    JButton[] buttons = new JButton[str.length];
​
•    //创建重置键CE
​
•    JButton reset = new JButton("CE");
​
•    //创建显示器,初始值为0
​
•    JTextField display = new JTextField("0");
​
​
​
•    public JCalculator() {
​
•      super("计算器");
​
•      //JPanel 是 Java图形用户界面(GUI)工具包swing中的面板容器类
​
•      JPanel panel1 = new JPanel();
​
•      //在容器中设置布局为GridLayout,并创建一个4*4的区域
​
•      panel1.setLayout(new GridLayout(4,4));
​
•      //将字符串中的常量赋值给按钮
​
•      for (i = 0; i < str.length; i++) {
​
•          buttons[i] = new JButton(str[i]);
​
•          panel1.add(buttons[i]);
​
•      }
​
​
​
•      JPanel panel2 = new JPanel();
​
•      //在panel2的容器中设置的布局为BorderLayout
​
•      panel2.setLayout(new BorderLayout());
​
•      //在panel2容器中显示屏和重置按钮的位置
​
•      panel2.add("Center", display);
​
•      panel2.add("East", reset);
​
•      // JPanel panel3 = new Panel();
​
•      //getContentPane()作用是初始化一个容器,设置布局格式为BorderLayout
​
•      getContentPane().setLayout(new BorderLayout());
​
•      //该容器包含panel2和panel1容器,设置他们的位置
​
•      getContentPane().add("North", panel2);
​
•      getContentPane().add("Center", panel1);
​
•      // 为panel1中的每个按钮添加监听器
​
•      for (i = 0; i < str.length; i++)
​
•          buttons[i].addActionListener(this);
​
•      // 为显示屏和CE重置按钮添加监听器
​
•      reset.addActionListener(this);
​
•      display.addActionListener(this);
​
•      // The "close" button "X".
​
•      addWindowListener(new WindowCloser());
​
​
​
•      setSize(800, 800);
​
•      //让JFrame对象显示出来:
​
•      setVisible(true);
​
•      // pack的作用是调整窗口的大小,使其适应组件的大小和布局。
​
•      pack();
​
•    } 
​
​
​
•    public void actionPerformed(ActionEvent e) {
​
•      Object target = e.getSource();
​
•      String label = e.getActionCommand();
​
•      if (target == reset) {
​
•      handleReset();        //CE重置方法
​
•      }
​
•      else if ("0123456789.".indexOf(label) >= 0) {
​
•      handleNumber(label);  //输入的是数字或小数点
​
•      }
​
•      else
​
•          handleOperator(label);  //输入的是符号,进行运算
​
•    }
​
 boolean isFirstDigit = true;
​
​
​
 public void handleReset() {
​
 display.setText("0");
​
 isFirstDigit = true;
​
 operator = "=";
​
 //注意在点击CE之后一定要重置isFirstDight和operator
​
//   System.out.println("CE之后的isDight  "+isFirstDigit);
​
 }
​
 public void handleNumber(String label) {
​
 if(isFirstDigit) {
​
 //判断是不是第一下按下
​
 if(label.equals(".")) {
​
 display.setText("0.");
​
 }else {
​
 display.setText(label);
​
 }
​
 }else if((label.equals("."))&&(display.getText().indexOf(".")<0)){
​
 //判断该符号是不是点,然后确定小数点在之前有没有出现过
​
 //如果符合条件,将显示屏上之前的数字加上一个小数点
​
 display.setText(display.getText()+".");
​
 }else if(!label.equals(".")) {
​
 //判断输入非首位的数字
​
 display.setText(display.getText()+label);
​
 }
​
 isFirstDigit = false;
​
 }
​
 double number = 0.0;
​
 String operator = "=";
​
 public void handleOperator(String label) {
​
 if(operator.equals("+")){
​
 //把数字类型的字符串,转换成Double类型
​
 number += Double.valueOf(display.getText());
​
 }
​
 else if(operator.equals("-")){
​
 number -= Double.valueOf(display.getText());
​
 }
​
 else if(operator.equals("*")){
​
 number *= Double.valueOf(display.getText());
​
 }
​
 else if(operator.equals("/")){
​
 number /= Double.valueOf(display.getText());
​
 }
​
 else if(operator.equals("=")){
​
 number = Double.valueOf(display.getText());
​
 }
​
 display.setText(String.valueOf(number));
​
 operator = label;
​
 isFirstDigit = true;
​
 }
​
•    public static void main(String[] args) {
​
•      new JCalculator();
​
•    }
​
}

1、利用GUI实现界面布局

首先是设计该程序的图形化界面,创建两个JPanel对象,JPanel 是 Java图形用户界面(GUI)工具包swing中的面板容器类,在第一个JPanel对象中以GridLayout为布局,创建一个4*4的空间,把这些空间分配给字符串中的16个常量(数字和符号),第二个JPanel对象以BorderLayout为布局,分配好显示框和CE重置按钮的空间。然后再利用getContentPane()设置新的容器,将布局设置为BorderLayout,然后分配好两个JPanel的空间。这样计算器的GUI界面就写好了。如图所示:

GUI计算器.png

2、计算器计算功能的实现

(1)actionPerformed()方法,该方法中含有e.getSource()和e.getActionCommand()监听鼠标事件,判断如果点击CE按钮,执行handleReset()方法重置计算器。如果点击的数字,执行handleNumber(label)方法,如果点击的是符号,执行handleOperator(label)方法。

(2)handleNumber(label)方法,该方法可以显示鼠标点击的数字和小数点,在方法外设置全局变量isFirstDigit,判断是不是在之前有没有输入过,如果为true代表首次输入,进入该语句中,再次进行判断,如果输入的为小数点,显示器显示0.,如果输入的数字,显示器原本的0将消除,剩下输入的数字,执行完if语句后isFirstDigit 设置为 false。第二个判断是判断该符号是不是点,然后确定小数点在之前有没有出现过,如果没有出现过在显示器上加上一个小数点,第三个判断是判断是不是数字,是数字的将在显示器继续显示,并且之前的数字不会消失。

(3) handleReset()方法,该方法是重置显示器上的数字,显示器将被设置显示为0,并且isFirstDigit和operator都被重置。

(4)handleOperator(label)方法,该方法对可以进行运算,当输入完第一个运算数字后,输入运算符,设置operator的全局变量为“=”,在该方法中以“=”为判断,将第一个数字可以保存在number中,新的运算符将会保存在operator中,同时isFirstDigit设置为true,代表开始输入第二个数字,当输入完后点击运算符,进入handleOperator(label)方法,会对两数字进行上一个运算符的运算,然后显示在显示器上。注意,在进行运算时,要用Double.valueOf将字符串改成Double形式。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容