利用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形式。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容