使用GUI实现计算器四则运算的图形界面

目前学习到GUI,所以通过写了一个计算器的四则运算来加固知识点,虽然这只是一个简单的界面,但是覆盖的知识点还是挺多的。

下面就用代码实现吧

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

public class Calculator {
    private JFrame jFrame;//创建一个容器
    private Container contentPane; //容器,一个表面的桌布
    private JTextField field1,field2,field3;//创建文本框
    private JComboBox jcb;//下拉框
    private JLabel resultLabel;//创建运算=
    private JButton jb1,jb2,jb3;//创建按钮
    
    String [] strings= {"+","-","x","/"};
    
    //构造方法初始化
    public Calculator() {
        jFrame=new JFrame("计算器");//初始化容器
        
        //设置大小
        jFrame.setSize(600,200);
        
        //设置窗口在显示屏的位置
        jFrame.setLocation(500, 300);
        
        //固定边框
        jFrame.setResizable(false);
        
        //设置直接关闭直接退出程序
        jFrame.setDefaultCloseOperation(jFrame.EXIT_ON_CLOSE);
        
        //创建一个获取三原色的类
        Color c=new Color(200,199,100);
        
        //初始化桌布容器
        contentPane=jFrame.getContentPane();  //获取相应的桌布对象
        
        //将背景颜色添加到桌布容器中
        contentPane.setBackground(c);
        
        //设置流式布局
        jFrame.setLayout(new FlowLayout());
        init();
    }
    
    
    //初始化方法
    public void init() {
        //1:初始化相应的组件
        field1=new JTextField(10);
        field2=new JTextField(10);
        field3=new JTextField(10);
        //初始化下拉框组件
        jcb=new JComboBox(strings);
        //初始化运算组件
        resultLabel=new JLabel("=");
        //初始化按钮组件
        jb1=new JButton("计算");
        jb2=new JButton("清空");
        jb3=new JButton("退出");
        
        //2:对各个组件进行字体,大小,加粗处理
        Font font=new Font("微软雅黑",Font.BOLD,15);
        
        //3:将这字体运用到各个组件中
        field1.setFont(font);
        field2.setFont(font);
        field3.setFont(font);
        jcb.setFont(font);
        resultLabel.setFont(font);
        jb1.setFont(font);
        jb2.setFont(font);
        jb3.setFont(font);
        //4:将对应的组件添加到容器中
        contentPane.add(field1);
        contentPane.add(jcb);
        contentPane.add(field2);
        contentPane.add(resultLabel);
        contentPane.add(field3);
        contentPane.add(jb1);
        contentPane.add(jb2);
        contentPane.add(jb3);
        
        //设置结果文本框不可编辑
        field3.setEditable(false);
        
        //设置输入为右边输入
        field1.setHorizontalAlignment(JTextField.RIGHT);
        field2.setHorizontalAlignment(JTextField.RIGHT);
        field3.setHorizontalAlignment(JTextField.RIGHT);
        
        //5:设置事件监听
        //计算监听事件
        jb1.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                String s1 = field1.getText().trim();//获取文本内容,去空格
                String s2 = field2.getText().trim();
                if (s1.equals("")||s2.equals("")) {
                    //提示框
                    JOptionPane.showMessageDialog(null, "請輸入非空數據");
                    return;
                }
                
                //将文本内容转换为整型
                int i1 = Integer.parseInt(s1);
                int i2 = Integer.parseInt(s2);
                
                //返回当前所选项,就是返回你选择的运算符
                String str1 = (String) jcb.getSelectedItem();
                
                
                //进行运算符判断,并进行相应的运算
                if (str1.equals("+")) {
                    int num=i1+i2;
                    field3.setText(num+"");
                }else if (str1.equals("-")) {
                    int num=i1-i2;
                    field3.setText(num+"");
                }else if (str1.equals("x")) {
                    int num=i1*i2;
                    field3.setText(num+"");
                }else if (str1.equals("/")) {
                    //当为除时,除数是不能为零的,所以进行相应的判断
                    if (i2==0) {
                        JOptionPane.showMessageDialog(null, "除数不能为0");
                        return;
                    }
                    int num=i1/i2;
                    field3.setText(num+"");
                }
                
            }
        });
        
        //添加清空事件
        jb2.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                field1.setText("");
                field2.setText("");
                field3.setText("");
                
            }
        });
        
        //添加退出事件
        jb3.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
                
            }
        });

    }
    
    //启动窗口的方法
    public void go() {
        //显示窗口可见
        jFrame.setVisible(true);
    }
    
    public static void main(String[] args) {
        new Calculator().go();
    } 

}

运行程序就会得到下面的界面


这里主要就是有两个注意的地方

1:就是运算符的下拉框的获取,要进行相应的运算我们得先知道是怎样运算,在运算事件中你要获取相应的运算符号,然后再进行相应的符号比较,就可以进行运算了。

2:获取的运算符号为 / 时我们就得进行判断了,因为在进行除运算时除数是不能为0的,当为0时给出一个弹窗,同时用return返回,不为0时就可以正常的运算。

 

 

  • 3
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录 一、课设任务及要求 1 二、需求分析 2 三、设计思路 3 四、详细设计 5 五、运行调试与分析讨论 9 六、设计体会与小结 14 七、参考文献 15 附录 16 中文摘要 Java是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称。用Java实现 的HotJava浏览器,显示了Java的魅力:跨平台、动感的Web、Internet计算。从此,Ja va被广泛接受并推动了Web的迅速发展,常用的浏览器现在均支持Java applet。另一方面,Java技术也不断更新。Java平台由Java虚拟机和Java 应用编程接口构成。Java 应用编程接口为Java应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩 展部分。在硬件或操作系统平台上安装一个Java平台之后,Java应用程序就可运行。现 在Java平台已经嵌入了几乎所有的操作系统。这样Java程序可以只编译一次,就可以在 各种系统中运行。 Java分为三个体系J2SE,J2EE,J2ME。 说起计算器,值得我们骄傲的是,最早的计算工具的诞生地是中国。 在17世纪初,西方国家的计算工具才有了较大的发展,英国数学家纳皮尔发明的"纳 皮尔算筹",英国牧师奥却德发明了圆柱型对数计算尺,这种计算尺不仅能做加减乘除、 乘方、开方运算,甚至可以计算三角函数,指数函数和对数函数,这些计算工具不仅带 动了计算器的发展,也为现代计算器发展奠定了良好的基础,进而成为了现代社会应用 广泛的计算工具。 关键词:java Java平台 计算器 课设任务及要求 1.课设任务 这次课程设计选择的题目为设计一个图形界面GUI)的计算器应用程序,完成简单 的算术运算。 这次课程设计的基本要求为设计计算器应用程序可以完成加法、减法、乘法、除 法和取余运算,且有小数点、正负号、求倒数、退格和清零功能。拓展功能根据自己的 能力添加。 这次课程设计的我选择添加的拓展功能为开平方根,平方,立方,判断素数,求lo g的功能。 本程序主要练习使用布局管理器设计一个计算器的界面,并练习使用事件监听器处 理数据的输入,并完成相关的计算。数据和运算符号的存储采用动态链表这种数据结构 实现。 这次课程设计选择的Java运行环境为: Windows XP sp3 +Eclipse+JDK 1.6 二、需求分析 1.系统功能需求分析 计算器是现在一个普遍应用的工具,能够解决许多人所无法计算的数据,节省大量 宝贵的时间。 2.系统功能分析 为了实现计算器系统的功能.主要有二个功能模块:输入、输出。 3.系统设计原则 基于计算器系统要具有适用性广、操作简便等特点.本系统预计要达到以下几个目标 : (1)、满足以上的功能要求; (2)、能够运行在常见的计算机及其配置上; 三、设计思路 1.关于布局问题 本次课程设计程序继承来自框架类(Frame),总体布局上选用布局管理器BorderLayout: (1)将单行文本框加入到"North"区域 (2)将面板panel加入到"Center"区域,同时panel包含了各种数字按钮和符号按钮。 面板panel采用Girdlayout布局,选用5行*5列,将各种按钮添加到面板panel,并增加按 钮监听事件。 布局完成后的效果图如下: 2.关于数据存储问题 计算器完成的是一个数学表达式,本次课程设计我选用的是使用链表(Linkedlist类 )来存储数字和运算符号。程序运行后,输入的所有数字及运算符号都全部存储在链表中 ,待最后运算时,再一一求出来进行计算。 3.关于事件监听的处理问题 计算器的各种按钮都需要一个对象来进行监视,以便对发生的事件做出处理。计算器 的各种按钮通过调用相应的方法将某个对象作为自己的监视器。 例如计算器中的数字按钮,其方法为: AddActionListener(监视器); 对于获取了监视器的数字按钮,通过相应的操作就会导致事件的发生,并通知监视器 ,监视器就会做出相应的处理。 四、详细设计 1.计算器系统主要功能模块 (1)、系统主要模块实现的功能 系统输入模块实现数字以及计算符号输入的功能,输出模块的结果在文本框中实现显 示。 (2)、系统输入窗体实现的效果 系统输入窗体设计效果如图所示: 上图为按数字键1234567890后,在文本框中的显示 (3)、系统主要模块功能描述 功能描述: 菜单项"计算器"主要服务于使用者.它包含了"输入"、"输出"、 两个功能。 输入功能:当使用者将数字输入后,会出现数字的显示;当使用者将计算符号输入时 候会有计算符号的录入。 输出功能:点击"输出"选项后.可实现计算的结果。 2.系统的实现 (1) 系统源文件类之间的关系 计算器系统共有3个java源文件:Calcul
可以使用Java Swing来实现一个图形界面计算器。以下是一个基本的示例代码: ```java import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; public class Calculator extends JFrame implements ActionListener { private JTextField displayField; // 显示文本框 private JPanel buttonPanel; // 按钮面板 // 按钮数组 private JButton[] buttons = { new JButton("7"), new JButton("8"), new JButton("9"), new JButton("/"), new JButton("4"), new JButton("5"), new JButton("6"), new JButton("*"), new JButton("1"), new JButton("2"), new JButton("3"), new JButton("-"), new JButton("0"), new JButton("."), new JButton("="), new JButton("+"), new JButton("sin"), new JButton("cos"), new JButton("tan"), new JButton("π") }; public Calculator() { super("Calculator"); // 设置窗口标题 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); displayField = new JTextField("0", 16); displayField.setEditable(false); // 设置文本框不可编辑 buttonPanel = new JPanel(); buttonPanel.setLayout(new GridLayout(5, 4, 5, 5)); // 设置按钮面板为5行4列的网格布局 // 将按钮添加到面板上并设置监听器 for (JButton button : buttons) { button.addActionListener(this); buttonPanel.add(button); } // 将文本框和按钮面板添加到窗口上 getContentPane().add(displayField, BorderLayout.NORTH); getContentPane().add(buttonPanel, BorderLayout.CENTER); pack(); // 调整窗口大小 setVisible(true); // 显示窗口 } public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if ("0123456789.".indexOf(cmd) != -1) { // 数字和小数点 if (displayField.getText().equals("0") && !cmd.equals(".")) { displayField.setText(cmd); } else { displayField.setText(displayField.getText() + cmd); } } else if ("+-*/".indexOf(cmd) != -1) { // 四则运算 double num1 = Double.parseDouble(displayField.getText()); displayField.setText("0"); String op = cmd; while (true) { String s = JOptionPane.showInputDialog("请输入第二个操作数:"); if (s == null || s.equals("")) { return; } try { double num2 = Double.parseDouble(s); double result = 0; switch (op) { case "+": result = num1 + num2; break; case "-": result = num1 - num2; break; case "*": result = num1 * num2; break; case "/": if (num2 == 0) { JOptionPane.showMessageDialog(this, "除数不能为0!", "错误", JOptionPane.ERROR_MESSAGE); return; } result = num1 / num2; break; } displayField.setText(Double.toString(result)); break; } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(this, "请输入有效的数字!", "错误", JOptionPane.ERROR_MESSAGE); } } } else if ("sin cos tan".indexOf(cmd) != -1) { // 三角函数 double num = Double.parseDouble(displayField.getText()); double result = 0; switch (cmd) { case "sin": result = Math.sin(num); break; case "cos": result = Math.cos(num); break; case "tan": result = Math.tan(num); break; } displayField.setText(Double.toString(result)); } else if (cmd.equals("π")) { // π displayField.setText(Double.toString(Math.PI)); } else if (cmd.equals("=")) { // 等于号 String expr = displayField.getText(); try { double result = evaluate(expr); displayField.setText(Double.toString(result)); } catch (IllegalArgumentException ex) { JOptionPane.showMessageDialog(this, ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE); } } } // 计算表达式的值 private double evaluate(String expr) { expr = expr.replace("π", Double.toString(Math.PI)); return CalculatorEngine.eval(expr); } public static void main(String[] args) { new Calculator(); } } class CalculatorEngine { // 运算符栈 private static Stack<String> operatorStack = new Stack<>(); // 操作数栈 private static Stack<Double> operandStack = new Stack<>(); // 运算符优先级表 private static final Map<String, Integer> precedenceTable = new HashMap<>(); static { precedenceTable.put("+", 1); precedenceTable.put("-", 1); precedenceTable.put("*", 2); precedenceTable.put("/", 2); } // 计算表达式的值 public static double eval(String expr) { operatorStack.clear(); operandStack.clear(); StringTokenizer tokenizer = new StringTokenizer(expr, "+-*/()", true); while (tokenizer.hasMoreTokens()) { String token = tokenizer.nextToken().trim(); if (token.equals("")) { continue; } if (isNumber(token)) { // 数字 double num = Double.parseDouble(token); operandStack.push(num); } else if (isOperator(token)) { // 运算符 while (!operatorStack.isEmpty() && isOperator(operatorStack.peek()) && precedenceTable.get(token) <= precedenceTable.get(operatorStack.peek())) { evalOperator(); } operatorStack.push(token); } else if (token.equals("(")) { // 左括号 operatorStack.push(token); } else if (token.equals(")")) { // 右括号 while (!operatorStack.isEmpty() && !operatorStack.peek().equals("(")) { evalOperator(); } if (operatorStack.isEmpty() || !operatorStack.pop().equals("(")) { throw new IllegalArgumentException("括号不匹配!"); } } else { // 非法字符 throw new IllegalArgumentException("非法字符:" + token); } } while (!operatorStack.isEmpty()) { if (operatorStack.peek().equals("(")) { throw new IllegalArgumentException("括号不匹配!"); } evalOperator(); } if (operandStack.size() != 1) { throw new IllegalArgumentException("表达式不正确!"); } return operandStack.pop(); } // 计算栈顶运算符 private static void evalOperator() { String op = operatorStack.pop(); if (operandStack.size() < 2) { throw new IllegalArgumentException("表达式不正确!"); } double num2 = operandStack.pop(); double num1 = operandStack.pop(); double result = 0; switch (op) { case "+": result = num1 + num2; break; case "-": result = num1 - num2; break; case "*": result = num1 * num2; break; case "/": if (num2 == 0) { throw new IllegalArgumentException("除数不能为0!"); } result = num1 / num2; break; } operandStack.push(result); } // 判断字符串是否为数字 private static boolean isNumber(String str) { try { Double.parseDouble(str); return true; } catch (NumberFormatException ex) { return false; } } // 判断字符串是否为运算符 private static boolean isOperator(String str) { return "+-*/".indexOf(str) != -1; } } ``` 这个计算器支持四则运算、带π的三角函数运算,也可以直接输入表达式进行计算。当输入表达式时,计算器会自动将π替换成3.14159265358979323846。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值