使用java swing完成简单的计算器
来源:互联网 发布:淘宝红包套现被处罚 编辑:程序博客网 时间:2024/05/17 02:07
计算器可以完成简单的四则运算
实现效果如下:
首先是主界面:
import javax.swing.JFrame;public class MainView {public static void main(String[] args) {JFrame frame=new MyCalculator();frame.setVisible(true);}}
然后是实现:
import java.awt.BorderLayout;import java.awt.Button;import java.awt.Color;import java.awt.Component;import java.awt.Container;import java.awt.GridBagConstraints;import java.awt.GridBagLayout;import java.awt.GridLayout;import java.awt.Image;import java.awt.Insets;import java.awt.MenuItem;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.InputEvent;import java.awt.event.KeyEvent;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.KeyStroke;public class MyCalculator extends JFrame implements ActionListener{/** * */private static final Insets insets = new Insets(0, 0, 0, 0);private static final long serialVersionUID = -5113379074442808199L;JMenu editMenu,helpMenu;JMenuItem copyMenuItem,pasteMenuItem,lookhelpMenuItem,aboutsMenuItem;JPanel panel;JPanel panel2;JButton buttonMC,buttonMR,buttonMS,buttonM1,buttonM2,buttonBS,buttonCE,buttonC;JButtonbuttonFC,buttongen,button7,button8,button9,buttonchu,buttonbai,button4;JButton button5,button6,buttoncheng,buttonx,button1,button2,button3,buttonjian;JButton button0,buttondian,buttonjia,buttondeng;JTextArea showText;JMenuBar menuBar;public MyCalculator() {initMenu();initFrame();}public void initMenu(){//设置菜单栏menuBar=new JMenuBar();//编辑菜单editMenu=new JMenu("编辑(E)");editMenu.setMnemonic('E');//菜单里的内容copyMenuItem=new JMenuItem("复制(C)");copyMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));copyMenuItem.setMnemonic('C');pasteMenuItem=new JMenuItem("粘贴(P)");pasteMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,InputEvent.CTRL_MASK));pasteMenuItem.setMnemonic('P');//向编辑菜单添加editMenu.add(copyMenuItem);editMenu.add(pasteMenuItem);//帮助菜单helpMenu=new JMenu("帮助(H)");helpMenu.setMnemonic('H');//菜单里的内容lookhelpMenuItem=new JMenuItem("查看帮助(V)");lookhelpMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1,0));lookhelpMenuItem.setMnemonic('V');aboutsMenuItem=new JMenuItem("关于计算器(A)");aboutsMenuItem.setMnemonic('A');//向帮助菜单添加helpMenu.add(lookhelpMenuItem);helpMenu.add(aboutsMenuItem);//向菜单栏添加编辑和帮助menuBar.add(editMenu);menuBar.add(helpMenu);this.setJMenuBar(menuBar); showText =new JTextArea();showText.setRows(2);showText.setText("");panel=new JPanel();panel2=new JPanel();panel.setLayout(new BorderLayout());//设置上方为文本panel.add(showText,BorderLayout.NORTH);panel.add(panel2);//嵌套布局panel2.setBackground(new Color(66, 166, 166));panel2.setLayout(new GridBagLayout());//第一行buttonMC=new JButton("MC");addComponent(panel2, buttonMC, 0, 0, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);buttonMR=new JButton("MR");addComponent(panel2, buttonMR, 1, 0, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);buttonMS=new JButton("MS");addComponent(panel2, buttonMS, 2, 0, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);buttonM1=new JButton("M+");addComponent(panel2, buttonM1, 3, 0, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);buttonM2=new JButton("M-");addComponent(panel2, buttonM2, 4, 0, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);//第二行buttonBS=new JButton("←");addComponent(panel2, buttonBS, 0, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);buttonBS.addActionListener(this);buttonCE=new JButton("CE");addComponent(panel2, buttonCE, 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);buttonC=new JButton("C");addComponent(panel2, buttonC, 2, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);buttonC.addActionListener(this);buttonFC=new JButton("+-");addComponent(panel2, buttonFC, 3, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);buttongen=new JButton("√");addComponent(panel2, buttongen, 4, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);//第三行button7=new JButton("7");addComponent(panel2, button7, 0, 2, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);button7.addActionListener(this);button8=new JButton("8");addComponent(panel2, button8, 1, 2, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);button8.addActionListener(this);button9=new JButton("9");addComponent(panel2, button9, 2, 2, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);button9.addActionListener(this);buttonchu=new JButton("/");addComponent(panel2, buttonchu, 3, 2, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);buttonchu.addActionListener(this);buttonbai=new JButton("%");addComponent(panel2, buttonbai, 4, 2, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);buttonbai.addActionListener(this);//第四行button4=new JButton("4");addComponent(panel2, button4, 0, 3, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);button4.addActionListener(this);button5=new JButton("5");addComponent(panel2, button5, 1, 3, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);button5.addActionListener(this);button6=new JButton("6");addComponent(panel2, button6, 2, 3, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);button6.addActionListener(this);buttoncheng=new JButton("*");addComponent(panel2, buttoncheng, 3, 3, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);buttoncheng.addActionListener(this);buttonx=new JButton("1/x");addComponent(panel2, buttonx, 4, 3, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);//第五行button1=new JButton("1");addComponent(panel2, button1, 0, 4, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);button1.addActionListener(this);button2=new JButton("2");addComponent(panel2, button2, 1, 4, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);button2.addActionListener(this);button3=new JButton("3");addComponent(panel2, button3, 2, 4, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);button3.addActionListener(this);buttonjian=new JButton("-");addComponent(panel2, buttonjian, 3, 4, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);buttonjian.addActionListener(this);buttondeng=new JButton("=");addComponent(panel2, buttondeng, 4, 4, 1, 2, GridBagConstraints.CENTER, GridBagConstraints.BOTH);buttondeng.addActionListener(this);//第六行button0=new JButton("0");addComponent(panel2, button0, 0, 5, 2, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);button0.addActionListener(this);buttondian=new JButton(".");addComponent(panel2, buttondian, 2, 5, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);buttonjia=new JButton("+");addComponent(panel2, buttonjia, 3, 5, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH);buttonjia.addActionListener(this);this.add(panel);}public void initFrame(){//设置关闭窗体即关闭程序this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体大小位置this.setSize(280, 320);this.setLocation(100, 100);//设置标题this.setTitle("呱?呱!");//设置图标Toolkit kit=Toolkit.getDefaultToolkit();Image img=kit.getImage("img/ico.jpg");this.setIconImage(img);this.setResizable(false);//设置可视(置于构造函数最后)}private static void addComponent(Container container, Component component, int gridx, int gridy,int gridwidth, int gridheight, int anchor, int fill) {//建立网格包对象GridBagConstraints gbc = new GridBagConstraints(gridx, gridy, gridwidth, gridheight, 1.0, 1.0,anchor, fill, insets, 0, 0);//添加到容器中container.add(component, gbc);}@Overridepublic void actionPerformed(ActionEvent e) {if (e.getSource()==button0) {int pos=showText.getCaretPosition();showText.insert("0", pos);}else if (e.getSource()==button1) {int pos=showText.getCaretPosition();showText.insert("1", pos);}else if (e.getSource()==button2) {int pos=showText.getCaretPosition();showText.insert("2", pos);}else if (e.getSource()==button3) {int pos=showText.getCaretPosition();showText.insert("3", pos);}else if (e.getSource()==button4) {int pos=showText.getCaretPosition();showText.insert("4", pos);}else if (e.getSource()==button5) {int pos=showText.getCaretPosition();showText.insert("5", pos);}else if (e.getSource()==button6) {int pos=showText.getCaretPosition();showText.insert("6", pos);}else if (e.getSource()==button7) {int pos=showText.getCaretPosition();showText.insert("7", pos);}else if (e.getSource()==button8) {int pos=showText.getCaretPosition();showText.insert("8", pos);}else if (e.getSource()==button9) {int pos=showText.getCaretPosition();showText.insert("9", pos);}else if (e.getSource()==buttonjia) {int pos=showText.getCaretPosition();showText.insert("+", pos);}else if (e.getSource()==buttonjian) {int pos=showText.getCaretPosition();showText.insert("-", pos);}else if (e.getSource()==buttoncheng) {int pos=showText.getCaretPosition();showText.insert("*", pos);}else if (e.getSource()==buttonchu) {int pos=showText.getCaretPosition();showText.insert("/", pos);}else if (e.getSource()==buttonBS) {int pos=showText.getCaretPosition();if( !( showText.getText().equals("")) ) { StringBuffer sb = new StringBuffer(); sb.append(showText.getText()); sb.delete(pos-1 , pos); showText.setText(sb.toString()); }}else if (e.getSource()==buttondeng) {int pos=showText.getCaretPosition();String cmd = showText.getText(); Calculate cl = new Calculate(); String resultMsg = cl.calResult(cmd); if ( resultMsg.equals("算式格式错误") || resultMsg.equals("除数不能为0") ) { JOptionPane.showMessageDialog(null, resultMsg, "错误", JOptionPane.WARNING_MESSAGE); } else { showText.insert("="+resultMsg, pos); } }else if (e.getSource()==buttonC) {showText.setText("");}}}最后是计算的工具类:
import java.util.Stack; import java.util.regex.Matcher; import java.util.regex.Pattern;import javax.swing.JFrame; //import sun.security.krb5.internal.ccache.CCacheInputStream; public class Calculate { private Stack<Double> numStack = new Stack<Double>(); private Stack<Character> sybStack = new Stack<Character>(); public String calResult ( String equation ) { //替换乘除号 equation = equation.replace("X", "*"); equation = equation.replace("÷", "/"); //处理负号 equation = negativeNumTransfer(equation); if ( !checkFormat(equation) ) { return "算式格式错误"; } equation += "#"; StringBuffer tempNum = new StringBuffer(); StringBuffer exp = new StringBuffer().append(equation); while ( exp.length() != 0 ) { String temp = exp.substring(0,1); exp.delete(0, 1); if( isNum(temp) ) { // temp是数字 tempNum.append(temp); } else { // temp不是数字 if (!"".equals(tempNum.toString())) { // 当表达式的第一个符号为括号 double num = Double.parseDouble(tempNum.toString()); numStack.push(num); tempNum.delete(0, tempNum.length()); } // 用当前取得的运算符与栈顶运算符比较优先级:若高于,则因为会先运算,放入栈顶;若等于,因为出现在后面, // 所以会后计算,所以栈顶元素出栈,取出操作数运算;若小于,则同理,取出栈顶元素运算,将结果入操作数栈。 // 判断当前运算符与栈顶元素优先级,取出元素,进行计算(因为优先级可能小于栈顶元素,还小于第二个元素等等,需要用循环判断) while ( !compare(temp.charAt(0)) && (!sybStack.empty()) ) { double a = numStack.pop(); double b = numStack.pop(); char ope = sybStack.pop(); // 进行简单的计算 if( simpleCal(ope, a, b) == false ) { return "除数不能为0"; } } // 判断当前运算符与栈顶元素优先级, 如果高,或者低于平,计算完后,将当前操作符号,放入操作符栈 refreshSybStack(temp); } } return getResultStr(numStack.pop()); } private void refreshSybStack ( String temp) { if (temp.charAt(0) != '#') { sybStack.push(new Character(temp.charAt(0))); if (temp.charAt(0) == ')') {// 当栈顶为'(',而当前元素为')'时,则是括号内以算完,去掉括号 sybStack.pop(); sybStack.pop(); } } } private boolean simpleCal ( char ope, double a, double b ) { double result = 0; switch (ope) { case '+': result = b + a; numStack.push(result); break; case '-': result = b - a; numStack.push(result); break; case '*': result = b * a; numStack.push(result); break; case '/': if ( a == 0.0 ) { return false; } else { result = b / a; numStack.push(result); break; } } return true; } private String negativeNumTransfer( String equation ) { // 处理算式,将表示负数的部分进行改动,转成calResult方法支持的 if( equation.length() <= 1 ) { return equation; } StringBuffer str = new StringBuffer().append(equation); for ( int i = 0; i < str.length()-1; ++i ) { if( !str.substring(i, i+1).equals("-") ) { continue; } if ( i == 0 ) { char temp = str.charAt(1); if( isNumChar(temp) || isDecimalPoint(temp) || isLeftBracket(temp) ) { str.insert(0, "0"); i++; } } else { char last = str.charAt(i-1); char next = str.charAt(i+1); if( isLeftBracket(last) && ( isNumChar(next) || isDecimalPoint(next) || isLeftBracket(next) ) ) { str.insert(i, "0"); i++; } } } return str.toString(); } private boolean checkFormat ( String equation ) { char[] c = equation.toCharArray(); int singleBracket = 0; for( int i = 0; i < c.length; ++i ) { if( isLeftBracket(c[i]) ) { singleBracket++; } if ( isRightBracket(c[i]) ) { singleBracket--; } if ( i == 0 ) { //第1个元素只能是[0-9]或者是左括号 if( !isLeftBracket(c[i]) && !isNumChar(c[i]) ) { return false; } } else if ( isNumChar(c[i]) || isDecimalPoint(c[i]) ) { //数字左边不能是右括号 if ( isRightBracket(c[i-1]) ) { return false; } } else if( isLeftBracket(c[i]) ) { // 左括号的左边不能是数字和右括号 if ( isNumChar(c[i-1]) || isDecimalPoint(c[i-1]) || isRightBracket(c[i-1]) ) { return false; } } else { // 右括号和四则运算符的左边只能是数字或者右括号 if ( !isNumChar(c[i-1]) && !isRightBracket(c[i-1]) ) { return false; } } } return singleBracket == 0; } private static boolean isNum ( String temp ) { return temp.matches("[0-9]") || temp.equals("."); } private static boolean isLeftBracket ( char c ) { return c == '('; } private static boolean isRightBracket ( char c ) { return c == ')'; } private static boolean isDecimalPoint ( char c ) { return c == '.'; } private static boolean isNumChar ( char c ) { return ( c >= '0' && c <= '9' ); } private boolean compare (char str) { if ( sybStack.empty() ) { // 当为空时,显然 当前优先级最低,返回高 return true; } char last = (char) sybStack.lastElement(); // 如果栈顶为'('显然,优先级最低,')'不可能为栈顶。 if (last == '(') { return true; } switch (str) { case '#': return false;// 结束符 case '(': // '('优先级最高,显然返回true return true; case ')': // ')'优先级最低, return false; case '*': { // '*/'优先级只比'+-'高 if (last == '+' || last == '-') return true; else return false; } case '/': { if (last == '+' || last == '-') return true; else return false; } // '+-'为最低,一直返回false case '+': return false; case '-': return false; } return true; } private String getResultStr ( double result ) { StringBuffer s = new StringBuffer().append( result + "" ); if ( s.substring(s.length() - 2).equals(".0") ) { s.delete( s.length()-2 , s.length() ); } return s.toString(); } }
阅读全文
0 0
- 使用java swing完成简单的计算器
- 用Java swing 编写简单的计算器
- 用Java swing制作简单的计算器
- Java swing实现简单计算器的开发
- java swing实现简单计算器
- java swing实现简单的计算器源代码程序
- JAVA Swing实现简单的体重指数(BMI)计算器
- 使用JS完成一个简单的计算器功能
- 基于Swing的简单应用(计算器)
- 使用JAVA swing实现简单的记事本
- 使用Java实现的简单的计算器
- Java Swing做的简易计算器
- Java源码-简单计算器界面的AWT实现与Swing实现之比较
- Java Swing计算器
- Java-Swing-计算器
- java Swing计算器
- Java swing 计算器
- java swing 计算器
- 《Spring实战》读书笔记1
- CSS IMG 居中自适应收集
- java.sql.Types,数据库字段类型,java数据类型的对应关系
- python学习之全局变量与局部变量
- Android中复制及粘贴功能
- 使用java swing完成简单的计算器
- centos操作系统中mysql的安装与配置
- 最简单方法让tomcat跑起php程序
- Hive(十九)--分桶
- Sql Server数据库使用触发器和sqlbulkcopy大批量数据插入更新
- python中defaultdict方法使用详解
- 扩增子统计绘图7三元图
- 小米四启用虚拟按键以及禁用实体按键
- 初次linux下安装apache2.4.27遇到的一点问题和解决方法