首页 > 编程语言 >java图形界面化计算器

java图形界面化计算器

时间:2023-11-22 22:33:12浏览次数:29  
标签:java 图形界面 inText else buttons 计算器 new getSource append


 虽然java的图形界界面化技术大部分都已经没有人使用了,但应老师的课堂要求,还是进行了一些简单的学习,并实现了一个图形界面化的可混合运算的简易计算器

这个计算器主要使用了java本身带有的Swing实现图形界面化,以及学习了部分的栈来实现混合运算

先把代码放上,除了(-)按键还没做好之外,其他都没什么问题

当然这也并不是完全由我自己独立完成的,借鉴了很多大佬的代码和思想

c

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Stack;

import javax.swing.*;

public class Calculate{
    private JFrame frame=new JFrame("计算器");
    private JPanel textFrame=new JPanel();
    private JPanel keyFrame =new JPanel();
    private JLabel tipLable = new JLabel();
    private JLabel inLable = new JLabel();
    private JLabel outLable = new JLabel();
    private StringBuilder inText=new StringBuilder();
    private StringBuilder outText=new StringBuilder(" ");
    private StringBuilder tipText=new StringBuilder(" ");
    public static Stack<Double> dateStack=new Stack<>();
    public static Stack<String> operatorStack=new Stack<>();
    private String butStr[]={"(-)","C","←","÷","7","8","9","×","4","5","6","-","1","2","3","+","%","0",".","="};

    StringBuilder resualt= new StringBuilder();
    private  JButton[] buttons=new JButton[butStr.length];

    public static void main(String[] args) {
        new Calculate().CreateCalculate();
    }

    /**
     * @Descripition 创建一个计算器对象
     */
    public void CreateCalculate (){
        //窗体的基本设置
        frame.setSize(450,600);
        frame.setVisible(true);
        frame.setLayout(new BorderLayout());
        frame.add(keyFrame,BorderLayout.CENTER);
        frame.add(textFrame,BorderLayout.NORTH);
        frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

        //文本框部分增加标签,设置布局方式
        textFrame.add(tipLable);
        textFrame.add(inLable);
        textFrame.add(outLable);

        textFrame.setLayout(new GridLayout(3,1,0,0));

        //提示标签的设置
        tipLable.setText(" ");
        tipLable.setHorizontalAlignment(SwingConstants.RIGHT);
        tipLable.setFont(new Font("宋体",Font.BOLD,20));
        tipLable.setBounds(-1,0,450,40);
        tipLable.setBorder(BorderFactory.createLineBorder(Color.GRAY,1));
        tipLable.setSize(450,20);
        tipLable.setForeground(Color.RED);

        //输入标签的设置
        inLable.setText(String.valueOf(inText));
        inLable.setHorizontalAlignment(JLabel.RIGHT);
        inLable.setFont(new Font("宋体",Font.BOLD,30));
        inLable.setBounds(-1,40,450,40);
        inLable.setBorder(BorderFactory.createLineBorder(Color.GRAY,1));
        inLable.setForeground(Color.BLACK);

        //输出标签的设置
        outLable.setText(String.valueOf(outText));
        outLable.setHorizontalAlignment(JLabel.RIGHT);
        outLable.setFont(new Font("宋体",Font.BOLD,40));
        outLable.setBounds(-1,80,450,40);
        outLable.setBorder(BorderFactory.createLineBorder(Color.GRAY,1));
        outLable.setForeground(Color.BLUE);

        //按键框架的布局方式
        keyFrame.setLayout(new GridLayout(5,4,4,4));

        //添加按钮至案件框架,同时分类绑定监听器
        for (int i = 0; i < butStr.length; i++) {
            buttons[i]=new JButton(butStr[i]);
            buttons[i].setFont(new Font("微软雅黑",Font.BOLD,30));
            if(strIsArry(butStr[i],"+,-,×,÷,%")){
                buttons[i].addActionListener(new operatorButtonHandler());
            }else if(strIsArry(butStr[i],"1,2,3,4,5,6,7,8,9,0,." )){
                buttons[i].addActionListener(new numberButtonHandler());
            }else if(strIsArry(butStr[i],"C,←,(-),=" )){
                buttons[i].addActionListener(new specialButtonHanler());
            }
            keyFrame.add(buttons[i]);
        }

    }

    /**
     * @Description 字符串是否包含对比,str:01,02 search:01
     * @Param [str, search]
     * @Return boolean
     */
    public static boolean strIsArry(String search, String str) {
        String[]  strs= str.split(",");
        for (String s : strs) {
            if ((s).equals(search)) {
                return true;
            }
        }
        return false;
    }

    public Double dateHandel(){
        resualt.delete(0,resualt.length());
        for (int i = 0; i <inText.length(); i++) {
            if(strIsArry(String.valueOf(inText.charAt(i)),"+,-,*,/,%")){
                resualt.append(" ").append(inText.charAt(i)).append(" ");
            }else {
                resualt.append(inText.charAt(i));
            }
        }

        String str[]=resualt.toString().split(" ");

        /*ArrayList<Object> list=new ArrayList<>();
        for (int i = 1; i < str.length; i++) {
            if(str[i]==" "){
                continue;
            } else if(strIsArry(str[i],"+,-,*,/,%")){
                list.add(str[i]);
            }else{
                list.add(Double.valueOf(str[i]));
            }
        }*/
        operatorStack.clear();
        dateStack.clear();

        for (int i = 0; i < str.length; i++) {
            if(strIsArry(str[i],"-,+")){
                while ((!operatorStack.isEmpty())&&strIsArry(String.valueOf(operatorStack.peek()),"+,-,*,/,%")){
                    dateStack.push(calculate());
                }
                operatorStack.push(str[i]);
            }else if(strIsArry(str[i],"%,/,*")){
                while((!operatorStack.isEmpty())&&strIsArry(operatorStack.peek(),"/,%,*")){
                    dateStack.push(calculate());
                }
                operatorStack.push(str[i]);
            }else {
                dateStack.push(Double.valueOf(str[i]));
            }
        }
        while(!operatorStack.isEmpty()){
            dateStack.push(calculate());
        }

        return dateStack.peek();
    }

    public Double calculate(){
        Double result =(double)0;
        Double beforeNum=dateStack.pop();
        Double afterNum=dateStack.pop();
        String op=operatorStack.pop();
        try {
            switch (op) {
                case "+" -> result = afterNum + beforeNum;
                case "-" -> result = afterNum - beforeNum;
                case "*" -> result = afterNum * beforeNum;
                case "/" -> result = afterNum / beforeNum;
                case "%" -> result = afterNum % beforeNum;
            }
        }
        catch (Exception e){
            tipLable.setText("运算出错请重新输入");
        }
        return result;
    }

    //数字按键
    private class numberButtonHandler implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            if(e.getSource().equals(buttons[4])){
                inText.append("7");
            } else if (e.getSource()==buttons[5]) {
                inText.append("8");
            }else if (e.getSource()==buttons[6]) {
                inText.append("9");
            }else if (e.getSource()==buttons[8]) {
                inText.append("4");
            }else if (e.getSource()==buttons[9]) {
                inText.append("5");
            }else if (e.getSource()==buttons[10]) {
                inText.append("6");
            }else if (e.getSource()==buttons[12]) {
                inText.append("1");
            }else if (e.getSource()==buttons[13]) {
                inText.append("2");
            }else if (e.getSource()==buttons[14]) {
                inText.append("3");
            }else if (e.getSource()==buttons[17]) {
                inText.append("0");
            }else if (e.getSource()==buttons[18]) {
                inText.append(".");
            }
            inLable.setText(String.valueOf(inText));
        }

    }
    //运算符按键
    private class operatorButtonHandler implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            if(e.getSource()==buttons[3]){
                inText.append("/");
            } else if (e.getSource()==buttons[7]) {
                inText.append("*");
            }else if (e.getSource()==buttons[11]) {
                inText.append("-");
            }else if (e.getSource()==buttons[15]) {
                inText.append("+");
            }else if (e.getSource()==buttons[16]) {
                inText.append("%");
            }
            inLable.setText(String.valueOf(inText));
        }

    }
    //行为按键
    private  class specialButtonHanler implements ActionListener{


        @Override
        public void actionPerformed(ActionEvent e) {
            if(e.getSource().equals(buttons[1])){
                inText= new StringBuilder();
                outText=new StringBuilder(" ");
                inLable.setText(String.valueOf(inText));
                outLable.setText(String.valueOf(outText));
                dateStack.clear();
                operatorStack.clear();
            }else if(e.getSource()==buttons[2]){
                if(inText.length()>=1){
                    inText.deleteCharAt(inText.length()-1);
                }
                inLable.setText(String.valueOf(inText));
            } else if (e.getSource()==buttons[0]) {
                inText.append("-");
                inLable.setText(String.valueOf(inText));
                /*inText.insert(0,"(");
                inText.insert(0,"-");
                inText.append(")");
                inLable.setText(String.valueOf(inText));*/
            } else  if (e.getSource()==buttons[19]){
                outLable.setText(String.valueOf(dateHandel()));
            }
        }

    }
}

标签:java,图形界面,inText,else,buttons,计算器,new,getSource,append
From: https://blog.51cto.com/u_16360983/8520277

相关文章

  • Java Scanner 类的使用
    目录1.概述2.使用举例2.1.从不同的输入源读取数据2.2.next()和nextLine()的区别2.3.读取大小已知的一维数组2.4.读取大小未知的一维数组2.5.读取长度大小已知的二维数组2.6.读取长度大小未知的二维锯齿数组1.概述(1)Scanner类是Java中一个用于读取用户输入的工......
  • Java正则表达式从入门到精通​
    Java正则表达式从入门到精通JAVA正则表达式规则Java中的正则表达式规则,在java.util.regex.Pattern类文档中有详细说明。字符类匹配符(只匹配一个字符)规则字符说明[abc]匹配a,b或c中的任意一个字符[^abc]除a,b或c之外的任意一个字符(取反)[a-zA-Z]包含在a到z或A到Z范围内的任意一个字符(......
  • Java——反射
    一、类的加载当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化加载就是将class文件读入内存,并为之创建一个Class对象任何类被使用时系统都会建立一个Class对象连接验证是......
  • Java语言基础知识全总结
    一.Java的优点1.      跨平台性。一次编译,到处运行。Java编译器会将Java代码编译成能在JVM上直接运行的字节码文件,C++会将源代码编译成可执行的二进制代码文件,所以C++执行速度快2.      纯面向对象。Java所有的代码都必须在类中书写。C++兼具面向对象和面向过程的特......
  • 【Java基础】集合之——ArrayList类
    集合集合,是一种容器,类似数组,集合大小可变ArrayList可变原理当创建ArrayList集合容器时,底层会存在一个长度为10个大小的空数组如果元素溢出,则扩容原数组1.5倍大小的新数组将原数组数据,拷贝到新数组中将新元素添加到新数组原数组变成垃圾数据由Java的垃圾处理器不定时回收......
  • Java综合-猜数字
    假设游戏者共有十人,且有10个不同的姓:张、王、李、赵、刘、于、许、金、钱、孙,魔术师将十个姓写在四张纸牌上,游戏者只需指出那几张纸上有自己的姓,魔术师就能准确的说出游戏者的姓 请编程实现:分组输出姓氏,让用户选择姓氏所在的组。给出你猜的姓氏。涉及知识点:JAVA语言的基......
  • Java——网络编程
    一、概述就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换网络模式一般是指OSI参考模型TCP/IP参考模型网络通信三要素IP地址:InetAddress网络中设备的标识,不易记忆,可用主机名......
  • 2024年面向Java程序员的20个系统和软件设计面试题
    0前言系统设计问题是编程面试的重要组成部分,如果你想取得好成绩,就必须准备。在我的网站,分享了八股面试题时,也分享了一些系统设计问题,但粉丝们一直在要求更多问题,因为这个主题的确很难掌握,需要更多练习。我自己也收集了一些从朋友和同事那里获得的面试题,但为了这篇文章和自己的准......
  • 访问不同BMC时使用不同的java版本
    因项目里的服务器较多,bmc版本不一致,总会需要java1.7,部分需要1.8.总是删除安装太麻烦了,深度着同时安装多个java版本,然后使用哪个版本时,切换一下就好了。java控制面板,java,查看,使用哪个就给哪个打对号。......
  • Java排序实战:如何高效实现电商产品排序
    在当今的数字化时代,电子商务已成为人们日常生活的重要组成部分。消费者可以在电商平台上浏览和购买来自全球的商品,这无疑为我们的生活带来了极大的便利。然而,随着电商平台的规模不断扩大,商品数量的急剧增加,如何对海量商品进行高效排序成为了电商系统开发的一大挑战。一、排序的重......