首页 > 其他分享 >实验5---Swing UI设计(简易计算器)

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

时间:2023-11-07 15:35:51浏览次数:25  
标签:awt java Swing --- UI 按钮 import 监听 计算器

一、实验目的

本实验的目的是掌握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();
    }
}

 

标签:awt,java,Swing,---,UI,按钮,import,监听,计算器
From: https://www.cnblogs.com/szmtjs10/p/17815098.html

相关文章

  • idea系列---【上一次打开springboot项目还好好的,现在打开突然无法启动了】
    问题昨天走的时候项目还能正常启动,今天来了之后突然报下面的错误:Error:Kotlin:ModulewascompiledwithanincompatibleversionofKotlin.Thebinaryversionofitsmetadatais1.7.1,expectedversionis1.1.16.解决方案点击idea:Build>RebuildProject重新编译即可......
  • asp.net中怎样用Javascript控制RequiredFieldValidator控件什么时候启用,什么时候不启
    Enable/DisableRequiredFieldValidatorwithJavascriptdocument.getElementById("requiredfieldvalidatorid").enabled=false;<asp:DropDownListID="ddlServiceName"runat="server"onchange='varDateValidator=docume......
  • AQS源码分析-Condition
    在生产者消费者模型这篇文章中我们使用了ReentrantLock结合Condition实现生产者消费者模型,但我们对于ReentrantLock和Condition的工作原理并不了解,其内部的结构和源码级别实现就更加不了解了。比如在使用await方法的时候,为什么一定要用while判断条件,用if为什么不行呢?使用Condition......
  • C++中的高阶函数 -- std::function实现回调
    C++中的高阶函数:以std::function优雅地实现回调1.简介1.1C++高阶函数的概念在函数式编程语言中,高阶函数(Higher-orderFunction)是一个常见的概念,它通常被定义为满足下列条件之一的函数: 接受一个或多个函数作为输入(参数)输出(返回值)是一个函数C++作为一门多范式编程语言,也......
  • python初学者学习笔记-第五章-函数
    chapter5/函数5.1函数基础5.1.1函数形式函数是可实现一个或多个功能的代码块;函数的特点:重用性、模块化;Python的内置函数,如print()、len()、min()、max()等;同时,我们也可以自定义函数;5.1.2函数调用参数是函数重要组成部分,python的参数灵活多样;参数类型:默认参数,关键字......
  • ReentrantLock源码笔记 - 获取锁(JDK 1.8)
    ReentrantLock学习-获取锁(JDK1.8)ReentrantLock提供非公平锁与公平锁两种加锁方式,默认加锁方式为非公平锁。ReentrantLock类的结构为:从图中可以看出,ReentrantLock类包含三个静态内部类:SyncNonfairSyncFairSync其中Sync类继承AbstractQueuedSynchronize(AQS),Nonf......
  • ReentrantLock源码笔记 - 释放锁(JDK 1.8)
    ReentrantLock源码学习-释放锁(unlock)上次谈到了利用ReentrantLock的非公平和公平加锁方式,那么接下来看看释放锁的流程首先调用ReentrantLock的unlock方法publicvoidunlock(){sync.release(1);}然后会调用AbstractQueuedSynchronizer(AQS)的release方法,在这个方法......
  • Util应用框架基础(五) - 异常处理
    本节介绍Util应用框架如何处理系统错误.概述系统在运行过程中可能发生错误.系统错误可以简单分为两类:系统异常系统本身出现的错误.业务异常不满足业务规则出现的错误.如何处理系统异常如果发生系统异常,大多数情况下,你除了记录异常日志外,可能无法处理它们.一个......
  • python初学者学习笔记-第四章-条件和循环
    chapter4/条件和循环4.1条件4.1.1基本形式条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的子程序;每个条件后面要使用冒号”:”,表示满足条件后执行子程序。缩进来划分子程序范围,相同缩进的语句组成一个整体子程序。如果“condition”为True,将执行"sub_p......
  • APP攻防--安卓逆向&JEB动态调试&LSPosed模块&算法提取&Hook技术
    JEB环境配置安装java环境变量(最好jdk11)安装adb环境变量设置adb环境变量最好以Android命名启动开发者模式设置-->关于平板电脑-->版本号(单机五次)开启USB调试设置-->系统-->高级-->开发者选项-->USB调试开启USB调试目的是为了后续让JEB能够获取模拟器上的进程......