基于Java swing组件实现简易计算器

 更新时间:2020年04月18日 08:43:00   作者:海螺肉  
这篇文章主要介绍了基于Java swing组件实现简易计算器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

本文记录了笔者的第一个Java程序,基于Java抽象窗口工具(abstract window toolkit , AWT)和Swing(Swing属于Java Foundation Classes的一部分)实现的建议计算器,由于笔者经验有限,初学Java,代码略带bug,无法实现7+5×8之类式子的计算,只能实现算术运算符按从高到低的式子运算,部分代码略显冗杂,希望大家在评论区积极讨论完善代码!

计算器示意图

一、代码相关知识简介

JFrame(框架)

使用JFrame frame = new JFrame("My Frame");可以创建一个名为My Frame的windows框架

import javax.swing.*;
public class Test {

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    JFrame frame = new JFrame("My Frame");
    
    frame.setSize(300,300);
    frame.setVisible(true);
  }

}

JButton(按钮)

使用JButton b = new JButtton("My Button");可创建一个按钮组件。

import java.awt.*;
import javax.swing.*;
public class Test {
  JFrame frame;

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    JFrame frame = new JFrame("My Frame");
    JButton b = new JButton("My Button");
    
    frame.getContentPane().add(b,BorderLayout.CENTER); //将按钮放在frame框架中央
    frame.setSize(300,300);
    frame.setVisible(true);
  }

}

JPanel(面板)

面板是一个容器,与顶层容器不同,JPanel不能独立存在,必须放在其他容器的内部,下面代码创建了含有一个按钮的红色面板。

import java.awt.*;
import javax.swing.*;
public class Test {
  JFrame frame;

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    JFrame frame = new JFrame("My Frame");
    JButton b = new JButton("My Button");
    JPanel panel = new JPanel();
    
    panel.add(b);
    panel.setBackground(Color.red);
    frame.getContentPane().add(panel,BorderLayout.SOUTH); //将面板放在frame框架南方
    frame.setSize(300,300);
    frame.setVisible(true);
  }

}

JTextArea(文本输入框)

使用 JTextArea 类可实现一个文本域,其常用构造方法如下。

①JTextArea():创建一个默认的文本域。

②JTextArea(int rows,int columns):创建一个具有指定行数和列数的文本域。

③JTextArea(String text):创建一个包含指定文本的文本域。

④JTextArea(String text,int rows,int columns):创建一个既包含指定文本,又包含指定行数和列数的多行文本域。

出相关组件介绍外与实现计算器还需对布局有简单了解,本文仅使用GridLayout布局管理器,因此只对此做出介绍,若读者需要还可自行理解其他布局管理器。

GridLayout是一种网络式的布局管理器,将容器空间化为几行几列的形式网格,可将每个组件放在其中一格。

GridLayout定义在java.awt包中,有如下三种构造方法

public GridLayout()
public GridLayout(int rows , int cols) //定义的布局有rows行cools列
public GridLayout(int rows , int cols,int h , int w) ////定义的布局有rows行cools列,水平间距为h,垂直间距为w

二、计算器功能

可实现加、减、乘、除功能,但由于笔者目前能力有限,若使用加、减、乘、除混合功能时需按运算符优先级,从高到小输入式子如7×8+5而不能按5+7×8输入,源代码如下:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Calculator implements ActionListener{
  JFrame frame;
  JButton b1,b2,b3,b4,b5,b6,b7,b8,b9,ba,bd,be,bf,bg,bh,b0,Clear;
  JTextArea ta;
  String Textcontent ="",sum="";
  double result=0;
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    Calculator cl = new Calculator();
    cl.go();
  }
  
  public void go()
  {
    frame = new JFrame("Calculator");
    ta = new JTextArea(1,20);        //设置文本框大小为1行20列
    ta.setBackground(Color.lightGray);
    JPanel cp = new JPanel();
    cp.setLayout(new GridLayout(4,4,5,5));  //四行四列,边距为5
    JPanel c = new JPanel();
    c.setLayout(new GridLayout(1,2,5,5));  //一行两列,边距为5
    b0 = new JButton("0");
    b0.addActionListener(this);       //为每个按钮添加监听接口
    
    b1 = new JButton("1");
    b1.addActionListener(this);
    
    b2 = new JButton("2");
    b2.addActionListener(this);
    
    b3 = new JButton("3");
    b3.addActionListener(this);
    
    b4 = new JButton("4");
    b4.addActionListener(this);
    
    b5 = new JButton("5");
    b5.addActionListener(this);
    
    b6 = new JButton("6");
    b6.addActionListener(this);
    
    b7 = new JButton("7");
    b7.addActionListener(this);
    
    b8 = new JButton("8");
    b8.addActionListener(this);
    
    b9 = new JButton("9");
    b9.addActionListener(this);
    
    ba = new JButton(".");
    ba.addActionListener(this);
    
    bd = new JButton("+");
    bd.addActionListener(this);
    
    be = new JButton("-");
    be.addActionListener(this);
    
    bf = new JButton("×");
    bf.addActionListener(this);
    
    bg = new JButton("/");
    bg.addActionListener(this);
    
    bh = new JButton("=");
    bh.addActionListener(this);
    
    Clear= new JButton("Clear");
    Clear.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e) {
        Textcontent ="";
        result=0;
        sum="";
        ta.setText("");
      }
    });
    
    c.add(ta);
    c.add(Clear);
    c.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
    cp.add(b7);
    cp.add(b8);
    cp.add(b9);
    cp.add(bd);
    cp.add(b4);
    cp.add(b5);
    cp.add(b6);
    cp.add(be);
    cp.add(b1);
    cp.add(b2);
    cp.add(b3);
    cp.add(bf);
    cp.add(b0);
    cp.add(ba);
    cp.add(bh);
    cp.add(bg);
    cp.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
    
    Container f = frame.getContentPane();
    f.add(c,BorderLayout.NORTH);
    f.add(cp,BorderLayout.SOUTH);
    
    frame.pack();
    frame.setVisible(true);
  }
  
  public void actionPerformed(ActionEvent e)
  {
    String content = e.getActionCommand();
    ta.append(e.getActionCommand());
    getTextContent(content);
  }
  
  
  public void getTextContent(String content)
  {
    if(content.equals("+")||content.equals("-")||content.equals("×")||content.equals("/"))
    {
      Textcontent = Textcontent+" "+content+" ";
    }
    else if(content.equals("="))
    {
      Textcontent = Textcontent+" "+content;
      sum=GetResult(Textcontent);
    }
    else
    {
      Textcontent = Textcontent+content;
    }
    ta.append(sum);
  }
  
  public String GetResult(String Textcontent)
  {
    String n=Textcontent;
    String []content=n.split(" ");
    result = Double.valueOf(content[0]);
    for(int i=1;i<content.length;i++)
    {
      switch(content[i])
      {
      case "+":
          result = result+Double.valueOf(content[i+1]);
        break;
      case "-":
          result = result-Double.valueOf(content[i+1]);
        break;
      case "×":
        result = result*Double.valueOf(content[i+1]);
        break;
      case "/":
          result = result/Double.valueOf(content[i+1]);
        break;
      case "=":
        break;
      }
    }
    return result+"";
  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • springboot做代理分发服务+代理鉴权的实现过程

    springboot做代理分发服务+代理鉴权的实现过程

    这篇文章主要介绍了springboot做代理分发服务+代理鉴权的实现过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 深入理解Java设计模式之解释器模式

    深入理解Java设计模式之解释器模式

    这篇文章主要介绍了JAVA设计模式之解释器模式的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解
    2021-11-11
  • Java字符串常见的操作(比较,查找,替换等)

    Java字符串常见的操作(比较,查找,替换等)

    在Java当中,为字符串类提供了丰富的操作方法,对于字符串,我们常见的操作就是:字符串的比较、查找、替换、拆分、截取以及其他的一些操作,本文就详细的介绍一下,感兴趣的可以了解一下
    2022-01-01
  • Java中的PrintWriter 介绍_动力节点Java学院整理

    Java中的PrintWriter 介绍_动力节点Java学院整理

    PrintWriter 是字符类型的打印输出流,它继承于Writer。接下来通过本文给大家介绍java中的 PrintWriter 相关知识,感兴趣的朋友一起学习吧
    2017-05-05
  • Java超详细整理讲解各种排序

    Java超详细整理讲解各种排序

    这篇文章主要介绍了Java常用的排序算法及代码实现,在Java开发中,对排序的应用需要熟练的掌握,这样才能够确保Java学习时候能够有扎实的基础能力。那Java有哪些排序算法呢?本文小编就来详细说说Java常见的排序算法,需要的朋友可以参考一下
    2022-07-07
  • java实现表单必填参数验证的方法

    java实现表单必填参数验证的方法

    表单校验是很多注册时必做的功能, 一般我们的处理都是很粗暴的写个if()判断, 然后抛异常. 本文将介绍通过代理的思想, 用注解优雅的处理非空判断,感兴趣的一起来了解一下
    2021-05-05
  • java利用udp实现发送数据

    java利用udp实现发送数据

    这篇文章主要为大家详细介绍了java利用udp实现发送数据,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • 解决@Autowired注入空指针问题(利用Bean的生命周期)

    解决@Autowired注入空指针问题(利用Bean的生命周期)

    这篇文章主要介绍了解决@Autowired注入空指针问题(利用Bean的生命周期),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Netty中ChannelPoolHandler调用处理程序详解

    Netty中ChannelPoolHandler调用处理程序详解

    这篇文章主要介绍了Netty中ChannelPoolHandler调用处理程序详解,Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程,但是你仍然可以使用底层的 API,需要的朋友可以参考下
    2023-11-11
  • IDEA中的maven没有dependencies解决方案

    IDEA中的maven没有dependencies解决方案

    这篇文章主要介绍了IDEA中的maven没有dependencies解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05

最新评论