锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

GUI:简易计算器设计

时间:2022-12-18 23:00:00 guh5红外线传感器

目录

一.界面设计

二.功能设计

三.代码实现

四.注意事项


一.界面设计

在设计计算器界面时,首先需要建立一个Frame作为显示窗口,后续界面设计是在显示窗口周围添加功能组件进行后续操作。

在显示窗口上,界面可以分为两部分。第一部分是顶部的文本域组件,用于显示要计算的公式。所有的计算公式和最终结果都显示在文本域。第二部分是下面的按钮组件。在实现下面的按钮组件时,设计理念是新建几个Panel将容器设置为FlowLayout分布式,每行按钮组件添加到行为单位,最后使用Box将之前新建的容器添加到容器中Panel容器,由于Frame容器默认为BorderLayout将文本域组件放置在分布模式中NORTH,放置按钮组件CENTER,之后调整Frame此时完成了计算器的界面设计,得到了以下效果图:

二.功能设计

分为输入过程功能设计和计算过程功能设计。

第一步是输入过程功能设计。这个过程主要实现在点击按钮后,点击的按钮内容显示在文本域组件中,从而构成要计算的公式。在此过程中,应注意两个操作符不能连续出现,否则是错误的公式。

本过程采用自定义事件监听器设计自定义事件监听器。

///定义数字按钮事件监听器类 class myListener_01 implements ActionListener         {             @Override             public void actionPerformed(ActionEvent e) {                 ta.append(e.getActionCommand());             }         }
///定义运算符事件监听器类 /*     1.多个操作符不能连接,否则不显示后添加的操作符     2.除号后不能只写0,除号后只写0,然后输入操作符,会将0删除 */ class myListener_02 implements ActionListener         {             @Override             public void actionPerformed(ActionEvent e) {                 String str = ta.getText();                 String chs = String.valueOf(str.charAt(str.length() - 1));                 String ch = String.valueOf(str.charAt(str.length()-2));                 if(chs.equals("/") || chs.equals("-") || chs.equals("*") || chs.equals(" "));                 else if(chs.equals("0") && ch.equals("/"))                 {                     StringBuilder sb = new StringBuilder(str);                     sb.delete(str.length()-1,str.length());                     ta.setText(sb.toString());                 }                 else{                     ta.append(e.getActionCommand());                 }             }         }

第二步,计算过程功能设计。通过输入过程的功能设计可以保证输入的算式符合运算规则,在计算过程功能设计中,主要针对在用户点击“=按照计算规则计算,得出正确的结果。

在这个过程中使用的方法是先在文本域中获取算式内容,因为这个内容是String类型不能直接计算,因此应将数字和算术符分离并转换为正确的格式。在这里,通过通历进行初步筛选,以实现文本域组件中的内容提取。

/*     该方法需要输入获得的文本域内容,一个用于存储数字的数组,一个用于存储操作符的数组 */ public void Traverse(String str,ArrayList arr,ArrayList chs)     {         StringBuilder sb = new StringBuilder();         for(int i=0;i

 三.代码实现

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;

public class Counter {
    //定义一个Window窗口
    Frame frame = new Frame("计算器");

    //组装界面
    public void Init()
    {
        //创建计算器的按键
        Panel p1 = new Panel(new FlowLayout(FlowLayout.LEFT,40,10));
        Button b11 = new Button("C");
        Button b12 = new Button("/");
        Button b13 = new Button("*");
        Button b14 = new Button("del");
        p1.add(b11);
        p1.add(b12);
        p1.add(b13);
        p1.add(b14);

        Panel p2 = new Panel(new FlowLayout(FlowLayout.LEFT,40,10));
        Button b21 = new Button("7");
        Button b22 = new Button("8");
        Button b23 = new Button("9");
        Button b24 = new Button("-");
        p2.add(b21);
        p2.add(b22);
        p2.add(b23);
        p2.add(b24);

        Panel p3 = new Panel(new FlowLayout(FlowLayout.LEFT,40,10));
        Button b31 = new Button("4");
        Button b32 = new Button("5");
        Button b33 = new Button("6");
        Button b34 = new Button("+");
        p3.add(b31);
        p3.add(b32);
        p3.add(b33);
        p3.add(b34);

        Panel p4 = new Panel(new FlowLayout(FlowLayout.LEFT,40,10));
        Button b41 = new Button("1");
        Button b42 = new Button("2");
        Button b43 = new Button("3");
        p4.add(b41);
        p4.add(b42);
        p4.add(b43);

        Panel p5 = new Panel(new FlowLayout(FlowLayout.LEFT,40,10));
        Button b51 = new Button("%");
        Button b52 = new Button("0");
        Button b53 = new Button(".");
        p5.add(b51);
        p5.add(b52);
        p5.add(b53);

        //组装按键
        Box vbox1 = Box.createVerticalBox();
        vbox1.add(p4);
        vbox1.add(p5);
        Box hbox1 = Box.createHorizontalBox();
        Button b44 = new Button("=");
        b44.setSize(25,128);
        hbox1.add(vbox1);
        hbox1.add(b44);
        hbox1.add(Box.createHorizontalStrut(45));


        Box vbox2 = Box.createVerticalBox();
        vbox2.add(p1);
        vbox2.add(p2);
        vbox2.add(p3);
        vbox2.add(hbox1);

        //组装计算器界面
        Panel panel = new Panel(new BorderLayout());
        TextArea ta = new TextArea(5,10);
        panel.add(ta,BorderLayout.NORTH);
        panel.add(vbox2);
        panel.setSize(421,521);

        frame.add(panel);
        frame.pack();
        frame.setLocation(200,200);
        frame.setResizable(false);
        frame.setVisible(true);

        //添加事件监听器
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        b11.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ta.setText("");
            }
        });

        class myListener_01 implements ActionListener
        {
            @Override
            public void actionPerformed(ActionEvent e) {
                ta.append(e.getActionCommand());
            }
        }

        myListener_01 myListener_01 = new myListener_01();
        b21.addActionListener(myListener_01);
        b22.addActionListener(myListener_01);
        b23.addActionListener(myListener_01);
        b31.addActionListener(myListener_01);
        b32.addActionListener(myListener_01);
        b33.addActionListener(myListener_01);
        b41.addActionListener(myListener_01);
        b42.addActionListener(myListener_01);
        b43.addActionListener(myListener_01);
        b52.addActionListener(myListener_01);
        b53.addActionListener(myListener_01);

        b14.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                StringBuilder sb = new StringBuilder(ta.getText());
                sb.delete(sb.length()-1,sb.length());
                ta.setText(sb.toString());
            }
        });

        class myListener_02 implements ActionListener
        {
            @Override
            public void actionPerformed(ActionEvent e) {
                String str = ta.getText();
                String chs = String.valueOf(str.charAt(str.length() - 1));
                String ch = String.valueOf(str.charAt(str.length()-2));
                if(chs.equals("/") || chs.equals("-") || chs.equals("*") || chs.equals("+"));
                else if(chs.equals("0") && ch.equals("/"))
                {
                    StringBuilder sb = new StringBuilder(str);
                    sb.delete(str.length()-1,str.length());
                    ta.setText(sb.toString());
                }
                else{
                    ta.append(e.getActionCommand());
                }
            }
        }

        myListener_02 myListener_02 = new myListener_02();
        b12.addActionListener(myListener_02);
        b13.addActionListener(myListener_02);
        b24.addActionListener(myListener_02);
        b34.addActionListener(myListener_02);

        b44.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ta.append(e.getActionCommand());
                ArrayList arr = new ArrayList();
                ArrayList chs = new ArrayList();
                Traverse(ta.getText(),arr,chs);

                Double[] d = new Double[arr.size()];
                String[] s = new String[chs.size()];
//                System.out.println(arr);
//                System.out.println(chs);
                boolean flag = true;
                for(int i=0;i arr,ArrayList chs)
    {
        StringBuilder sb = new StringBuilder();
        for(int i=0;i 四.注意事项 
    

由于编译器译码方式的不同,再不加修改的情况下运行上述代码,最后的界面中按钮部分内容无法正常显示,若想正常显示内容,可按照下图修改:(采用IDEA演示)

 

在完成上述修改后,再运行程序,即可正常显示。

 可能存在思虑不周的情况,若有更好的实现方式,欢迎斧正!

共同进步!

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章