import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
 
public class Demo
{
    // 窗体对象
    private static JFrame frame = null;
    // 面板对象
    private static JPanel pan1 = null;
    private static JPanel pan2 = null;
    private static JPanel pan3 = null;
    private static JPanel pan4 = null;
    private static JPanel pan5 = null;
    // 字体对象
    private static Font font = new Font("楷体", Font.BOLD, 18);
    private static Font font1 = new Font("楷体", Font.BOLD, 28);
    // 创建一个单行文本框
    private static JTextField result = new JTextField();
    //事件对象
    private static MyActionListener mal = new MyActionListener(result);
 
    static {
        // 初始化窗体。
        frame = new JFrame("计算器");
        // 表格布局7*3,水平和垂直间距为3
        frame.setLayout(new GridLayout(6, 3, 3, 3));
        // 设置关闭按钮
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 显示窗体
        frame.setVisible(true);
        // 大小固定
        frame.setResizable(false);
        // 设置窗体大小以内容大小决定
        frame.pack();
        // 设置文本框字体
        result.setFont(font1);
        // 设置颜色
        result.setDisabledTextColor(new Color(000000));
        // 禁用
        result.disable();
        // 添加单行文本框到窗体
        frame.add(result);
        // 创建pan1面板容器,指定为表格布局,1*4,水平垂直间距为3
        JPanel pan1 = new JPanel(new GridLayout(1, 4, 3, 3));
        // 创建pan2面板容器,指定为表格布局,1*4,水平垂直间距为3
        JPanel pan2 = new JPanel(new GridLayout(1, 4, 3, 3));
        // 创建pan3面板容器,指定为表格布局,1*4,水平垂直间距为3
        JPanel pan3 = new JPanel(new GridLayout(1, 4, 3, 3));
        // 创建pan4面板容器,指定为表格布局,1*4,水平垂直间距为3
        JPanel pan4 = new JPanel(new GridLayout(1, 4, 3, 3));
        // 创建pan4面板容器,指定为表格布局,1*4,水平垂直间距为3
        JPanel pan5 = new JPanel(new GridLayout(1, 4, 3, 3));
        // 定义数组str3数组,并初始化
        String str1[] = {"1", "2", "3", "+" };
        JButton btn1 = null;
        for (int i = 0; i < str1.length; i++) {
            btn1 = new JButton("" + str1[i]);
            // 添加事件
            btn1.addActionListener(mal);
            // 设置按钮字体
            btn1.setFont(font);
            // 把数组中的按钮添加到pan3容器中
            pan1.add(btn1);
        }
 
        // 定义数组str2数组,并初始化
        String str2[] = {"4", "5", "6", "-" };
        // 创建按钮模型
        JButton btn2 = null;
        for (int i = 0; i < str2.length; i++) {
            btn2 = new JButton("" + str2[i]);
            // 添加事件
            btn2.addActionListener(mal);
            // 设置按钮字体
            btn2.setFont(font);
            // 把数组中的按钮添加到pan2容器中
            pan2.add(btn2);
        }
 
        // 定义一个str3数组,并初始化
        String str3[] = {"7", "8", "9", "*", };
        // 创建一个空按钮模型btn3
        JButton btn3 = null;
        for (int i = 0; i < str3.length; i++) {
            btn3 = new JButton("" + str3[i]);
            // 添加事件
            btn3.addActionListener(mal);
            // 设置按钮字体
            btn3.setFont(font);
            // 利用循环逐个添加到pan1面板容器中
            pan3.add(btn3);
        }
 
        // 定义数组str4数组,并初始化
        String str4[] = {"0", "清空", "退格", "/" };
        JButton btn4 = null;
        for (int i = 0; i < str4.length; i++) {
            btn4 = new JButton("" + str4[i]);
            // 添加事件
            btn4.addActionListener(mal);
            // 设置按钮字体
            btn4.setFont(font);
            // 把数组中的按钮添加到pan4容器中
            pan4.add(btn4);
        }
 
        // 定义数组str5数组,并初始化
        String str5[] = {".", "=" };
        JButton btn5 = null;
        for (int i = 0; i < str5.length; i++) {
            btn5 = new JButton("" + str5[i]);
            // 添加事件
            btn5.addActionListener(mal);
            // 设置按钮字体
            btn5.setFont(font);
            // 把数组中的按钮添加到pan4容器中
            pan5.add(btn5);
        }
 
        // 添加pan1容器到窗体中
        frame.add(pan1);
        // 添加pan2容器到窗体中
        frame.add(pan2);
        // 添加pan3容器到窗体中
        frame.add(pan3);
        // 添加pan4容器到窗体中
        frame.add(pan4);
        // 添加pan5容器到窗体中
        frame.add(pan5);
 
    }
 
    public static void main(String[] args) {
        /**
         * 这里我不知道为什么,放在静态代码块中窗口大小就是无效设置。
         */
        // 窗口大小
        frame.setSize(350, 480);
    }
}
 
class MyActionListener implements ActionListener
{
    // 上面类中的结果显示面板。
    JTextField result;
    // 对应结果显示面板中的显示内容。
    String show = "";
 
    // 构造方法,创建对象的时候需要传入,显示面板。
    public MyActionListener(JTextField result) {
        super();
        this.result = result;
    }
 
    // 监听方法
    @Override
    public void actionPerformed(ActionEvent e) {
        // 获取事件源。
        JButton btn = (JButton) e.getSource();
        // 获取事件源的文本信息。
        String text = btn.getText();
 
        switch (text) {
            case "清空":
                // 清空操作。
                show = "";
                result.setText(show);
                break;
            case "退格":
                // 退格操作。
                if (result.getText().length() != 0) {
                    show = show.substring(0, show.length() - 1);
                    result.setText(show);
                }
                break;
            default:
                // 如果用户第一个输入的不是数字,就不让输入.
                if (result.getText().length() == 0 && text.equals("+")) {
                    return;
                }
                if (result.getText().length() == 0 && text.equals("-")) {
                    return;
                }
                if (result.getText().length() == 0 && text.equals("*")) {
                    return;
                }
                if (result.getText().length() == 0 && text.equals("/")) {
                    return;
                }
                if (result.getText().length() == 0 && text.equals(".")) {
                    return;
                }
                if (result.getText().length() == 0 && text.equals("=")) {
                    return;
                }
                if (result.getText().length() == 0 && text.equals("0")) {
                    return;
                }
                // 如果第二次输入的内容和第一次输入一样都是非数字,就不让输入。
                if (show.length() != 0) {
                    String substring = show.substring(show.length() - 1);
                    if (substring.equals("+") || substring.equals("-") || substring.equals("*") || substring.equals("/")
                            || substring.equals(".")) {
                        if (text.equals("+") || text.equals("-") || text.equals("*") || text.equals("/")
                                || text.equals(".")) {
                            return;
                        }
                    }
                }
                // 如果输入的是 等于号,就调用方法,获取表达式的正确结果。
                if (text.equals("=")) {
                    show = execute(show);
                    // 将结果设置到 结果显示面板上。
                    result.setText(show);
                    return;
                }
                // 否则就继续添加表达式。
                else {
                    show += text;
                    result.setText(show);
                }
                break;
        }
    }
 
    // 表達式的結果处理。
    public String execute(String ex) {
        // 使用JS的eval方法计算表达式的结果。
 
        // 获取JavaScript执行引擎
        ScriptEngineManager m = new ScriptEngineManager();
        // 执行JavaScript代码
        ScriptEngine engine = m.getEngineByName("JavaScript");
        Object rs = null;
        try {
            rs = engine.eval(ex);
        }
        catch (ScriptException e) {
            e.printStackTrace();
        }
        // 当用户除以0 时, 结果为:Infinity 这里当除以0时,正确结果应该是:0
        if (rs.toString().equals("Infinity")) {
            return "0";
        }
        else {
            return rs.toString();
        }
    }
 
}

  

【JAVA】可视化计算器的更多相关文章

  1. Java可视化计算器

    利用java中的AWT和SWING包来做可视化界面. 首先来简单了解一下这两个包: AWT和Swing都是Java中用来做可视化界面的.AWT(Abstract Window Toolkit):抽象窗 ...

  2. JAVA 可视化分析工具 第12节

    JAVA 可视化分析工具  第12节 经过前几章对堆内存以及垃圾收集机制的学习,相信小伙伴们已经建立了一套比较完整的理论体系!那么这章我们就根据已有的理论知识,通过可视化工具来实践一番. 我们今天要讲 ...

  3. [java] 可视化日历的实现(基于Calendar类 )

    写在前面 博文安排顺序如下 1.写在前面 2.源码 3.思路 4.相关知识 该小程序是对Date类及其相关类的复习 要求如下图:实现可视化日历 实现思路 1.先从键盘输入指定格式的字符串(str)2. ...

  4. java简单计算器

    写的一个小计算器,留着以后看吧. import java.awt.BorderLayout; import java.awt.Button; import java.awt.Color; import ...

  5. Java可视化AWT

    AWT 总体上Swing组件替代了绝大部分AWT组件,对AWT图形用户界面编程有极好的补充和加强. package ch11; import java.awt.*; /** * Created by ...

  6. java 学习 ——计算器小程序

    简易计算器小程序代码: package jisuanqi; //声明须要插入的包 import java.awt.*; import java.lang.Object; import java.lan ...

  7. 【java图形计算器】 java awt swing组件应用

    package package1; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swi ...

  8. Java可视化日历(Date类、DATe Format类、Calendar类综合运用),开发可视化日历小程序

    Java时间日期类综合运用,开发可视化日历小程序 由键盘输入指定格式的日期,打印这个月的日历 1.代码 import java.text.DateFormat; import java.text.Pa ...

  9. Java可视化编程---SendMail工具的开发

    介绍: SendMail是一款简便的163邮箱发件工具 利用了163的SMTP接口来发送邮件 版本号:SendMail v1.0 在编写发送邮件工具之前,还需要安装 JavaMail API 和Jav ...

随机推荐

  1. 离线服务器安装zabbix

    因为机房内的服务器并不是所有都能上外网,所以利用zabbix官方源的安装方法就行不通了,又嫌弃编译安装麻烦,所以这里选择离线RPM包安装zabbix.(如需完整rpm包可以留言与我联系) 下载zabb ...

  2. Java匹马行天下之教你用学汉语式方法学编程语言

    Java匹马行天下之教你用学汉语式方法学编程语言 前言: 前段时间接连更新了带小白从入门到了解的几篇博客: <Java匹马行天下之编程常识知多少> <Java匹马行天下之走进编程的殿 ...

  3. 软件开发工具(第7章:Eclipse入门)

    一.Eclipse简介 Eclipse [iˈklips],是一个开放源代 码的.基于Java的可扩展集成应 用程序开发环境. Eclipse最初主要用来进行Java语 言开发,但并非只有这个用途. ...

  4. 强大得分布式项目管理工具Git

    ---恢复内容开始--- 强大的分布式管理工具-Git(一) 前言:最近忙着写项目,在期间呢,用的是git管理,由于一个项目的管理是很重要得,所以整理了一篇关于git得博客跟大家分享一下.大家都知道, ...

  5. SpringBootSecurity学习(23)前后端分离版之OAuth2.0 其它模式

    密码模式 前面介绍了授权码模式和刷新令牌两种获取最新令牌的方法,下面来看一下其它模式.首先看密码模式,我们默认配置的三种模式中其实就包含密码模式的支持: 因此我们启动项目,直接使用密码模式即可,访问地 ...

  6. Java字符串课后作业

    [实验任务] 1.实验题目:字串加密 2.实验内容:古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报:

  7. 最简单的ArcGIS Engine应用程序(终)

    在上文的基础上,下面将使用简单的代码实现要素类属性的查看.(最简单的ArcGIS Engine应用程序(下)) 新增一个窗体,并从工具箱拖动DataGridView控件到该窗体中.设置该对象的Dock ...

  8. Java8两大特性(一)——Stream

    什么是Stream? Stream(流)是一个来自数据源的元素队列并且支持聚合操作,元素流在管道中经过中间操作,最终操作得到结果. 数据源:集合,数组,I/O channel,产生器generator ...

  9. 不得不看的秘诀,如何成为一名合格的web前端工程师

    何为:前端工程师? 前端工程师,也叫Web前端开发工程师.他是随着web发展,细分出来的行业. Web前端开发技术主要包括三个要素:HTML.CSS和JavaScript! 它要求前端开发工程师不仅要 ...

  10. 03 【PMP】组织结构类型的优缺点和适用范围包括哪些

    一.职能型组织优点:1.强大的技术支持,便于交流:2.清晰的职业生涯晋升路线:3.直线沟通.交流简单.责任和权限很清晰:4.有利于重复性工作为主的过程管理 职能型组织缺点:1.智能利益优先于项目,具有 ...