实验5---Swing UI设计(简易计算器)

发布时间 2023-11-07 15:26:22作者: szmtjs10

一、实验目的

本实验的目的是掌握JAVA容器类JFrame和JPanel的使用;掌握Swing常用布局的使用;掌握常用可视组件的使用。

二、实验内容

完成一个简单的计算器的功能。实现的效果图如下所示:

 

 

计算器 实现的计算功能为:加、减、乘、除法、求余;“C”为清除,“<-“为退格等功能。

三、实验步骤

  1. 声明一个文本栏控件,用于显示计算结果
  2. 定义一个字符串数组,将计算器中按钮的文字都放在该数组中
  3. 声明一个按钮数组
  4. 使用BorderLayout.NORTH将文本栏控件放置在窗体框架的北部
  5. 使用GridLayout(5,4)设置一个网格布局并将该网格布局放到一个 JPanel面板上
  6. 分别实例化按钮监听对象和键盘监听对象
  7. 注册监听
  8. 设置窗口属性
  9. 写实现加减乘除取余计算的函数 写点击按钮监听类和键盘监听类(分别监听数字,运算符,退格和清 除)

四、实验结果

 

五、实验小结

本次实验我学会了JAVA容器类JFrame和JPanel的使用,还有键盘监听和按钮监听的使用。在设计计算器时,要把数字按钮(键盘),运算符按钮(键盘),清除按钮和退格按钮分开判断。在进行清除设计时,不能简单的把文本框设为空,而应该在将文本框设为空的同时,将其他值也设为初始值;在进行退格设计时,也不能简单的把文本框中的字符串长度减一,而是要进行判断,在退格之前的按钮类型是数字还是运算符。通过这次实验,我明白了,做一个程序需要有严谨的逻辑思维能力!


六、源代码

package 菜鸟教程.JavaSwing介绍;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Calculator extends JFrame {
    // 声明一个文本栏控件,用于显示计算结果
    private JTextField txtResult;
    private JPanel p;
    // 定义一个字符串数组,将计算器中按钮的文字都放在该数组中
    private String name[] = { "7", "8", "9", "+",
            "4", "5", "6", "-",
            "1", "2","3", "*",
            "0", ".", "=", "/",
            "<-", "C", "%", " "};
    // 声明一个按钮数组,该数组的长度以字符串数组的长度为准
    private JButton button[] = new JButton[name.length];
    // 定义一个存放计算结果的变量,初始为0
    private double result = 0;
    // 存放最后一个操作符,初始为“=”
    private String lastCommand = "=";
    // 标识是否是开始
    private boolean start = true;
    String input;
    char key;
    public Calculator() {
        super("计算器");
// 实例化文本栏控件
        txtResult = new JTextField(20);
// 设置文本框不是焦点状态
        txtResult.setFocusable(false);
// 将文本栏控件放置在窗体框架的上方(北部)
        this.add(txtResult, BorderLayout.NORTH);
// 实例化面板对象,同时设置此面板布局为5行4列的网格布局
        p = new JPanel(new GridLayout(5, 4));
// 循环实例化按钮对象数组
// 实例化按钮监听对象
        ButtonAction ba = new ButtonAction();
// 实例化键盘监听对象
        KeyAction ka = new KeyAction();
        for (int i = 0; i < button.length; i++) {
            button[i] = new JButton(name[i]);
// 注册监听
            button[i].addActionListener(ba);
            button[i].addKeyListener(ka);
            p.add(button[i]);
        }

        this.add(p, BorderLayout.CENTER);
// 设定窗口大小
        this.setSize(300, 300);
// 设定窗口左上角坐标
        this.setLocation(200, 100);
// 设定窗口默认关闭方式为退出应用程序
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置窗口可视(显示)
        this.setVisible(true);
    }

    // 计算
    public void calculate(double x) {
        if (lastCommand.equals("+"))
            result += x;
        else if (lastCommand.equals("-"))
            result -= x;
        else if (lastCommand.equals("*"))
            result *= x;
        else if (lastCommand.equals("/"))
            result /= x;
        else if (lastCommand.equals("="))
            result = x;
        else if (lastCommand.equals("%"))
            result %= x;
//else if (lastCommand.equals("C"))
// result = 0;
// 将结果显示在文本栏
        txtResult.setText("" + result);
    }

    // 点击按钮监听
    private class ButtonAction implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            String input1=input;
            input = e.getActionCommand();
// 点击操作符号按钮
            if (input.equals("+") || input.equals("-") || input.equals("*")
                    || input.equals("/") || input.equals("=") || input.equals("%")) {
                if (start) {
                    if (input.equals("-")) {
                        txtResult.setText(input);
                        start = false;
                    }
                    else
                        lastCommand = input;
                } else {
                    calculate(Double.parseDouble(txtResult.getText()));
                    lastCommand = input;
                    start = true;
                }
            } else if(input.equals("C")) {
                result = 0;
                lastCommand = "=";
                start = true;
                txtResult.setText(" ");
            }else if(input.equals("<-")) {
                if(input1.equals("+")|| input1.equals("-") || input1.equals("*")
                        || input1.equals("/")|| input1.equals("%") ){
                    result=Double.parseDouble(txtResult.getText());
                    input1="=";
                    lastCommand = "=";
                }else {
                    String a;
                    a=txtResult.getText();
                    a = a.substring(0, a.length()-1);
                    txtResult.setText(a);
                }
            }
            else {
                if (start) {
                    txtResult.setText("");
                    start = false;
                }
                txtResult.setText(txtResult.getText() + input);
            }
        }
    }

    // 键盘监听
    private class KeyAction extends KeyAdapter {
        public void keyTyped(KeyEvent e) {
            char key1=key;
            key = e.getKeyChar();
// 敲击的键盘是数字
            if (key == '0' || key == '1' || key == '2' || key == '3'
                    || key == '4' || key == '5' || key == '6' || key == '7'
                    || key == '8' || key == '9' || key == '9') {
                if (start) {
                    txtResult.setText("");
                    start = false;
                }
                txtResult.setText(txtResult.getText() + key);
            }
// 敲击的键盘是操作符号
            else if (key == '+' || key == '-' || key == '*' || key == '/'
                    || key == '='|| key =='%') {
                if (start) {
                    if (key == '-') {
                        txtResult.setText(String.valueOf(key));
                        start = false;
                    } else
                        lastCommand = String.valueOf(key);
                } else {
                    calculate(Double.parseDouble(txtResult.getText()));
                    lastCommand = String.valueOf(key);
                    start = true;
                }
            }else if(key == 'c' || key == 'C') {
                result = 0;
                lastCommand = "=";
                start = true;
                txtResult.setText(" ");
            }else if(key == 46) {
                if(key1 == '+' || key1 == '-' || key1 == '*' || key1 == '/'|| key1 =='%' ){
//result=0;
                    key1='=';
                    lastCommand = "=";
                }else {
                    String a;
                    a=txtResult.getText();
                    a = a.substring(0, a.length()-1);
                    txtResult.setText(a);
                }
            }
        }
    }

    public static void main(String[] args) {
        new Calculator();
    }
}