这学期 Java 就快结课了, 上机课最后布置了几个题, 最后一题要求写一个计算器有点意思, 记录一下.
需求:
设计一个在 windows 系统中可以使用的 "计算器" 窗口并实现 (+,-,×,÷ 等) 其功能.
实现计算器, 首先要有一个窗口:
- // 创建窗口
- final JFrame jf = new JFrame("计算器");
- // 流动布局, 居中
- jf.setLayout(new FlowLayout(1,5,5));
- jf.setSize(293,251);
- //
- jf.setLocationRelativeTo(null);
- jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
- // 不可以改变大小
- jf.setResizable(false);
- // 创建容器, 存放显示数字框和 C 按钮
- JPanel panel1 = new JPanel();
- // 定义按钮面板, 并设置为网格布局, 4 行 4 列, 组件水平, 垂直间距均为 3
- JPanel panel2 = new JPanel(new GridLayout(4,4,1,1));
有了窗口容器, 就要往里面添加组件了. 计算器首先要有一个文本框来显示数字, 然后还要有数字按钮, 加减乘除小数点等号, 最后还要一个删除按钮 C .
然后一一添加即可.
- // 创建文本域, 放置输入数据和结果
- JTextArea text = new JTextArea(1,13);
- // 设置字体
- text.setFont(new Font(null, Font.PLAIN, 20));
- // 设置大小
- text.setPreferredSize(new Dimension(190,28));
- // 不可编辑
- text.setEditable(false);
- panel1.add(text);
- // 创建一个清除按钮'C'
- JButton btnC = new JButton("C");
- btnC.setFont(new Font(null, Font.PLAIN, 20));
- btnC.setPreferredSize(new Dimension(55,28));
- panel1.add(btnC);
- // 按钮数组
- String btn_str[] = {"1","2","3","/","4","5","6","*","7","8","9","-","0",".","=","+"};
- JButton btn[] = new JButton[btn_str.length];
- for(int i = 0 ; i <btn_str.length ; i++ ){
- btn[i]=new JButton(btn_str[i]);
- btn[i].setFont(new Font(null, Font.PLAIN, 20));
- btn[i].setPreferredSize(new Dimension(70,42));
- panel2.add(btn[i]);
- }
这里通过循环创建按钮数组. 省时又省力, 快乐好心情.
到这里面板内容就做好了, 接下来就需要为每个按钮添加功能.
先来看数字按钮和运算符号按钮:
- // 按钮功能
- for(int i = 0 ; i < btn_str.length ; i++) {
- if(i != 14) {
- // 如果不是等于号
- int j = i;
- btn[i].addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- // 获取文本框内容
- String textStr = text.getText();
- // 如果有等号, 清空文本框
- if(textStr.indexOf("=") != -1) {
- text.setText("");
- }
- // 获取按钮字符添加到文本框
- String s = btn[j].getText();
- text.append(s);
- }
- });
- }else {
- // 如果点击等于号
- btn[i].addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- try {
- // 获取文本框内容
- String gongshi = text.getText();
- // 计算公式
- String jieguo = jse.eval(gongshi).toString();
- // 如果结果字符串过长, 只显示等号和结果
- if(jieguo.length()> 18) {
- jieguo = jieguo.substring(jieguo.length()-16, jieguo.length());
- text.setText("=");
- text.append(jieguo);
- }else {
- text.append("=");
- text.append(jieguo);
- }
- // 如果出错
- } catch (Exception t) {
- text.setText("");
- }
- }
- });
- }
- }{ }// 皮皮狗子写的!
i = 14 的时候呢, 这个按钮是 '=' 号, 所有要区别对待一下.
用户点击按钮的时候, 获取到按钮上的字符, 然后将该字符添加的文本框内, 当用户点击等于号的时候进行计算.
这里计算的时候用到了这个方法.
String jieguo = jse.eval(gongshi).toString();
通过下面这条语句引入这个方法.
static ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");
通过这个方法可以自动将字符串类型的公式计算出结果, 并且可以通过 try-catch 捕捉到错误.
接下来实现删除键 C :
- // C 键 功能
- btnC.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- String textStr = text.getText();
- if(textStr.indexOf("=") != -1) {
- text.setText("");
- }else {
- textStr = textStr.substring(0,(textStr.length() - 1));
- text.setText(textStr);
- }
- }
- });
最后将面板添加到窗口:
- // 把 面板容器 设置到 窗口
- // panel1 设置到顶部
- jf.getContentPane().add(panel1,BorderLayout.NORTH);
- // panel1 设置到底部
- jf.getContentPane().add(panel2,BorderLayout.CENTER);
- // 显示窗口, 前面创建的信息都在内存中, 通过 jf.setVisible(true) 把内存中的窗口显示在屏幕上.
- jf.setVisible(true);
OK, 一个简单的计算器就完成了!
计算器
2018/6/12
来源: http://www.jianshu.com/p/44994ef0f335