热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

java模仿windows计算器示例

这篇文章主要介绍了java模仿windows计算器示例,需要的朋友可以参考下

这个计算器的界面模仿Windows自带的简易计算器,包括交互界面和和对各种输入的响应。目前尚未实现菜单栏和记忆类按钮的功能

代码如下:

import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.plaf.basic.BasicBorders;

public class Calculator extends JFrame {
 private static final long serialVersiOnUID= 1L;
 Container c = getContentPane();
 StringBuilder number1 = new StringBuilder("");// 储存第1个数字字符串
 StringBuilder number2 = new StringBuilder("");// 储存第2个数字字符串
 StringBuilder operator = new StringBuilder("");// 储存运算符
 StringBuilder result = new StringBuilder("");// 储存运算结果
 JTextField numbershow = new JTextField("0.");// 数字显示区域,初始显示为"0."

 public static void main(String[] args) {// 主方法
  Calculator c1 = new Calculator();
  c1.setVisible(true);
 }

 public Calculator() {// 计算器构造方法
  setTitle("计算器");
  setBounds(100, 100, 260, 245);
  setResizable(false);
  setLayout(null);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  createMenuBar();// 创建菜单栏
  createNumberShow();// 创建数字显示区域
  createMemoShow();// 创建记忆显示
  createClearButtons();// 创建Backspace,CE,C等三个按钮
  createButtonArea();// 创建数字按钮区域
 }

 private void createMenuBar() {// 创建菜单栏的方法
  JMenuBar menubar = new JMenuBar();
  setJMenuBar(menubar);
  JMenu menu1 = new JMenu("编辑");
  JMenu menu2 = new JMenu("查看");
  JMenu menu3 = new JMenu("帮助");
  menubar.add(menu1);
  menubar.add(menu2);
  menubar.add(menu3);
  JMenuItem menu1item1 = new JMenuItem("复制");
  JMenuItem menu1item2 = new JMenuItem("粘贴");
  JMenuItem menu2item1 = new JMenuItem("标准型");
  JMenuItem menu2item2 = new JMenuItem("科学型");
  JMenuItem menu2item3 = new JMenuItem("科学分组");
  JMenuItem menu3item1 = new JMenuItem("帮助主题");
  JMenuItem menu3item2 = new JMenuItem("关于计算器");
  menu1.add(menu1item1);
  menu1.add(menu1item2);
  menu2.add(menu2item1);
  menu2.add(menu2item2);
  menu2.add(menu2item3);
  menu3.add(menu3item1);
  menu3.add(menu3item2);
 }

 private void createNumberShow() {// 创建数字显示区域的方法
  numbershow.setHorizontalAlignment(JTextField.RIGHT);
  numbershow.setBounds(5, 0, 245, 22);
  numbershow.setEnabled(false);
  numbershow.setDisabledTextColor(Color.BLACK);
  c.add(numbershow);
 }

 private void createMemoShow() {// 创建记忆显示的方法
  JTextField memoshow = new JTextField();
  memoshow.setEditable(false);
  memoshow.setBounds(10, 30, 28, 22);
  memoshow.setBorder(new BasicBorders.FieldBorder(Color.black,
    Color.black, Color.white, Color.white));
  c.add(memoshow);
 }

 private void createClearButtons() {// 创建Backspace,CE,C等三个按钮的方法
  JButton[] clearbutton = new JButton[3];
  String[] clearbuttOntext= { "Backspace", "CE", "C" };
  for (int i = 0; i <3; i++) {
   clearbutton[i] = new JButton();
   clearbutton[i].setText(clearbuttontext[i]);
   clearbutton[i].setHorizontalAlignment(SwingConstants.CENTER);
   clearbutton[i].setMargin(new Insets(0, 0, 0, 0));
   clearbutton[i].setFont(new java.awt.Font("Arial", 0, 9));
   clearbutton[i].setForeground(Color.blue);
   clearbutton[i].setBounds(48 + i * 68, 30, 63, 22);
   clearbutton[i].setForeground(Color.red);
   c.add(clearbutton[i]);
  }

  clearbutton[0].addActionListener(new ActionListener() {// 为Backspace按钮添加监听器
     @Override
     public void actionPerformed(ActionEvent e) {
      if (number1.toString().equals("")) {// 如果未做任何输入
       showNumber(numbershow, number1);// 显示number1
      } else if (operator.toString().equals("")) {// 如果只输入了number1
       number1.deleteCharAt(number1.toString().length() - 1);// 将number1的最后一个字符去掉
       showNumber(numbershow, number1);// 显示number1
      } else if (number2.toString().equals("")) {// 如果只输入了number1和operator
       showNumber(numbershow, number1);// 不作任何处理,显示number1
      } else {// 如果输入了number1、operator、number2
       number2.deleteCharAt(number2.toString().length() - 1);// 将number2的最后一个字符去掉
       showNumber(numbershow, number2);// 显示number2
      }
     }
    });

  clearbutton[1].addActionListener(new ActionListener() {// 为CE按钮添加监听器
     @Override
     public void actionPerformed(ActionEvent e) {
      if (number1.toString().equals("")) {// 如果未做任何输入
       showNumber(numbershow, number1);// 显示number1
      } else if (operator.toString().equals("")) {// 如果只输入了number1
       number1.setLength(0);// 清除number1
       showNumber(numbershow, number1);// 显示number1
      } else if (number2.toString().equals("")) {// 如果输入了number1和operator
       showNumber(numbershow, number2);// 不作任何处理,显示number2
      } else {// 如果输入了number1、operator、number2
       number2.setLength(0);// 清除number2
       showNumber(numbershow, number2);// 显示number2
      }
     }
    });

  clearbutton[2].addActionListener(new ActionListener() {// 为C按钮添加监听器
     @Override
     public void actionPerformed(ActionEvent e) {// 将所有储存清零
      number1.setLength(0);
      number2.setLength(0);
      operator.setLength(0);
      numbershow.setText("0.");
      result.setLength(0);
     }
    });
 }

 private void createButtonArea() {// 创建数字按钮区域的方法
  JPanel ButtOnArea= new JPanel();
  ButtonArea.setBounds(5, 55, 245, 125);
  ButtonArea.setLayout(new GridLayout(4, 6, 5, 5));
  c.add(ButtonArea);

  JButton[] numberbutton = new JButton[24];
  String[] numberbuttOntext= { "MC", "7", "8", "9", "/", "sqrt", "MR",
    "4", "5", "6", "*", "%", "MS", "1", "2", "3", "-", "1/X", "M+",
    "0", "+/-", ".", "+", "=" };
  for (int i = 0; i <24; i++) {// 使用循环为这24个按钮添加标识
   numberbutton[i] = new JButton(numberbuttontext[i]);
   ButtonArea.add(numberbutton[i]);
   if (i % 6 == 0 || i % 6 == 4 || i == 23) {// 操作符按钮设置为红色
    numberbutton[i].setHorizontalAlignment(SwingConstants.CENTER);
    numberbutton[i].setMargin(new Insets(0, 0, 0, 0));
    numberbutton[i].setFont(new java.awt.Font("Arial", 0, 9));
    numberbutton[i].setForeground(Color.red);
   } else {// 其它设置为蓝色
    numberbutton[i].setHorizontalAlignment(SwingConstants.CENTER);
    numberbutton[i].setMargin(new Insets(0, 0, 0, 0));
    numberbutton[i].setFont(new java.awt.Font("Arial", 0, 9));
    numberbutton[i].setForeground(Color.blue);
   }
  }

  int[] numbers = { 19, 13, 14, 15, 7, 8, 9, 1, 2, 3 };// 该数组中的数字分别代表0-9等数字在numberbuttontext数组中序号
  for (int i = 0; i <= 9; i++) { // 使用循环为这0-9这十个数字按钮添加监听器
   final String str = String.valueOf(i);
   numberbutton[numbers[i]].addActionListener(new ActionListener() {// 为0-9按钮添加监听器
      @Override
      public void actionPerformed(ActionEvent e) {
       if (operator.toString().equals("")) {// 没有输入operator之前
        add(number1, str); // 只设置number1的值
        showNumber(numbershow, number1);// 只显示number1的值
       } else {// 输入operator之后
        add(number2, str);// 只设置number2的值
        showNumber(numbershow, number2);// 只显示number2的值
       }
      }
     });
  }

  numberbutton[20].addActionListener(new ActionListener() { // 为"+/-"按钮添加监听器
     @Override
     public void actionPerformed(ActionEvent e) {
      if (operator.toString().equals("")) {// 没有输入operator之前
       add(number1, "+/-");// 只设置number1的值
       showNumber(numbershow, number1);// 只显示number1的值
      } else {// 输入operator之后
       add(number2, "+/-");// 只设置number2的值
       showNumber(numbershow, number2);// 只显示number2的值
      }
     }
    });

  numberbutton[21].addActionListener(new ActionListener() { // 为"."按钮添加监听器
     @Override
     public void actionPerformed(ActionEvent e) {
      if (operator.toString().equals("")) {// 在输入operator之前,只显示number1的值
       add(number1, ".");
       showNumber(numbershow, number1);
      } else {// 在输入operator之后,只显示number2的值
       add(number2, ".");
       showNumber(numbershow, number2);
      }
     }
    });

  numberbutton[22].addActionListener(new ActionListener() { // 为"+"按钮添加监听器
     @Override
     public void actionPerformed(ActionEvent e) {
      operator.setLength(0);
      operator.append("+");
     }
    });

  numberbutton[16].addActionListener(new ActionListener() { // 为"-"按钮添加监听器
     @Override
     public void actionPerformed(ActionEvent e) {
      operator.setLength(0);
      operator.append("-");
     }
    });

  numberbutton[10].addActionListener(new ActionListener() { // 为"*"按钮添加监听器
     @Override
     public void actionPerformed(ActionEvent e) {
      operator.setLength(0);
      operator.append("*");
     }
    });

  numberbutton[4].addActionListener(new ActionListener() { // 为"/"按钮添加监听器
     @Override
     public void actionPerformed(ActionEvent e) {
      operator.setLength(0);
      operator.append("/");
     }
    });

  numberbutton[23].addActionListener(new ActionListener() { // 为"="按钮添加监听器
     @Override
     public void actionPerformed(ActionEvent e) {
      if (number1.toString().equals("")) {// 当number1为空时
       showNumber(numbershow, number1);
      } else if (operator.toString().equals("")) {// 当number1不为空,而operator为空时
       showNumber(numbershow, number1);
      } else if (number2.toString().equals("")) {// 当number1、operator均不为空,而number2为空时
       switch (operator.toString()) {
       case ("+"): {
        number2.append(number1.toString());
        double d = Double.parseDouble(number1
          .toString())
          + Double.parseDouble(number2.toString());
        result.setLength(0);
        result.append(d);
        showNumber(numbershow, result);
        number1.setLength(0);
        number1.append(d);
       }
        break;
       case ("-"): {
        number2.append(number1.toString());
        double d = Double.parseDouble(number1
          .toString())
          - Double.parseDouble(number2.toString());
        result.setLength(0);
        result.append(d);
        showNumber(numbershow, result);
        number1.setLength(0);
        number1.append(d);
       }
        break;
       case ("*"): {
        number2.append(number1.toString());
        double d = Double.parseDouble(number1
          .toString())
          * Double.parseDouble(number2.toString());
        result.setLength(0);
        result.append(d);
        showNumber(numbershow, result);
        number1.setLength(0);
        number1.append(d);
       }
        break;
       case ("/"): {
        number2.append(number1.toString());
        double d = Double.parseDouble(number1
          .toString())
          / Double.parseDouble(number2.toString());
        result.setLength(0);
        result.append(d);
        showNumber(numbershow, result);
        number1.setLength(0);
        number1.append(d);
       }
        break;
       }
      } else {// 当number1、operator、number2均不为空时
       switch (operator.toString()) {
       case ("+"): {
        double d = Double.parseDouble(number1
          .toString())
          + Double.parseDouble(number2.toString());
        result.setLength(0);
        result.append(d);
        showNumber(numbershow, result);
        number1.setLength(0);
        number1.append(d);
       }
        break;
       case ("-"): {
        double d = Double.parseDouble(number1
          .toString())
          - Double.parseDouble(number2.toString());
        result.setLength(0);
        result.append(d);
        showNumber(numbershow, result);
        number1.setLength(0);
        number1.append(d);
       }
        break;
       case ("*"): {
        double d = Double.parseDouble(number1
          .toString())
          * Double.parseDouble(number2.toString());
        result.setLength(0);
        result.append(d);
        showNumber(numbershow, result);
        number1.setLength(0);
        number1.append(d);
       }
        break;
       case ("/"): {
        double d = Double.parseDouble(number1
          .toString())
          / Double.parseDouble(number2.toString());
        result.setLength(0);
        result.append(d);
        showNumber(numbershow, result);
        number1.setLength(0);
        number1.append(d);
       }
        break;
       }
      }
     }
    });

  numberbutton[17].addActionListener(new ActionListener() { // 为"1/x"按钮添加监听器
     @Override
     public void actionPerformed(ActionEvent e) {
      if (number1.toString().equals("")) {// 没有输入number1时
       numbershow.setText("除数不能为零");
      } else if (operator.toString().equals("")) {// 输入了number1,但没有输入operator
       if (Double.parseDouble(number1.toString()) == 0) {// 如果number1的值为零
        numbershow.setText("除数不能为零");
       } else {// 如果number1的值不为零
        double d = 1 / (Double.parseDouble(number1
          .toString()));
        number1.setLength(0);
        number1.append(d);// 将number1的值开放并存储
        showNumber(numbershow, number1);
       }
      } else if (number2.toString().equals("")) {// 输入了number1、operator,但没有输入number2
       double d = 1 / (Double.parseDouble(number1
         .toString()));
       number2.append(d);// 将number1的值开放并存储
       showNumber(numbershow, number2);
      } else {// 输入了number1、operator,number2
       double d = 1 / (Double.parseDouble(number2
         .toString()));
       number2.setLength(0);
       number2.append(d);// 将number2的值开放并存储
       showNumber(numbershow, number2);
      }
     }
    });

  numberbutton[11].addActionListener(new ActionListener() { // 为"%"按钮添加监听器
     @Override
     public void actionPerformed(ActionEvent e) {
      // 暂时空缺
     }
    });

  numberbutton[5].addActionListener(new ActionListener() { // 为"sqrt"按钮添加监听器
     @Override
     public void actionPerformed(ActionEvent e) {
      if (number1.toString().equals("")) {// 没有输入number1时
       showNumber(numbershow, number1);
      } else if (operator.toString().equals("")) {// 输入了number1,但没有输入operator
       if (Double.parseDouble(number1.toString()) <0) {// number1小于0
        numbershow.setText("函数输入无效");
       } else {// number1大于0
        double d = Math.sqrt(Double.parseDouble(number1
          .toString()));
        number1.setLength(0);
        number1.append(d);// 将number1的值开放并存储
        showNumber(numbershow, number1);
       }
      } else if (number2.toString().equals("")) {// 输入了number1、operator,但没有输入number2
       double d = Math.sqrt(Double.parseDouble(number1
         .toString()));
       number2.append(d);// 将number1的值开放并存储
       showNumber(numbershow, number2);
      } else {// 输入了number1、operator、number2
       double d = Math.sqrt(Double.parseDouble(number2
         .toString()));
       number2.setLength(0);
       number2.append(d);// 将number2的值开放并存储
       showNumber(numbershow, number2);
      }
     }
    });
 }

 public void add(StringBuilder s1, String s2) {// 定义按钮输入后数字字符串变化的方法
  if (s2.equals("+/-")) {// 定义输入"+/-"后数字字符串的变化
   if (s1.toString().equals("") || s1.toString().equals("0")) {// 如果数字字符串为空或者0,那么不发生变化
    s1.append("");
   } else {// 如果数字字符串不为空也不为0,那么在数字字符串前增加或删除"-"字符
    if (s1.toString().startsWith("-")) {
     s1.deleteCharAt(0);
    } else {
     s1.insert(0, "-");
    }
   }
  }
  if (s2.equals(".")) {// 定义输入"."后数字字符串的变化
   if (s1.toString().indexOf(".") == -1) {// 查找数字字符串中是否含有"."字符,如果没有则执行以下代码
    if (s1.toString().equals("")) {// 如果数字字符串为空,那么将数字字符串设置为"0."
     s1.setLength(0);
     s1.append("0.");
    } else {
     s1.append(".");
    }
   } else {// 如果有,则不发生变化
    s1.append("");
   }
  }
  if (s2.equals("0")) {// 定义输入"0"后数字字符串的变化
   if (s1.toString().equals("0")) {// 当数字的字符串为"0"时,不发生变化
    s1.append("");
   } else {// 当数字的字符串吧为"0"时,在其字符串后增加"0"
    s1.append("0");
   }
  }
  for (int i = 1; i <10; i++) {// 通过循环,定义输入1-9后数字字符串的变化
   String str = String.valueOf(i);
   if (s2.equals(str)) {// 定义输入1-9后数字字符串的变化
    if (s1.toString().equals("0")) {
     s1.setLength(0);
     s1.append(str);
    } else
     s1.append(str);
   }
  }
 }

 public void showNumber(JTextField j, StringBuilder s) {// 定义数字显示区域如何显示数字字符串的方法
  if (s.toString().equals("") == true || s.toString().equals("0") == true) {
   j.setText("0.");
  } else if (s.toString().indexOf(".") == -1) {
   j.setText(s.toString() + ".");
  } else {
   j.setText(s.toString());
  }
 }
}




推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • Win10下游戏不能全屏的解决方法及兼容游戏列表
    本文介绍了Win10下游戏不能全屏的解决方法,包括修改注册表默认值和查看兼容游戏列表。同时提供了部分已经支持Win10的热门游戏列表,帮助玩家解决游戏不能全屏的问题。 ... [详细]
  • 如何在联想win10专业版中修改账户名称
    本文介绍了在联想win10专业版中修改账户名称的方法,包括在计算机管理中找到要修改的账户,通过重命名来修改登录名和属性来修改显示名称。同时指出了windows10家庭版无法使用此方法的限制。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 电脑公司win7剪切板位置及使用方法
    本文介绍了电脑公司win7剪切板的位置和使用方法。剪切板一般位于c:\windows\system32目录,程序名为clipbrd.exe。通过在搜索栏中输入cmd打开命令提示符窗口,并输入clip /?即可调用剪贴板查看器。赶紧来试试看吧!更多精彩文章请关注本站。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
author-avatar
wocanimagebi
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有