Java实现计算器----【完全自主完成】
来源:互联网 发布:java代码解压rar文件 编辑:程序博客网 时间:2024/06/05 11:16
- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- import javax.swing.border.BevelBorder;
- import javax.swing.border.Border;
- public class SwingCalculator implements ActionListener{
- public JButton makeButton(String label, Color color, Font font) {
- JButton b = new JButton(label);
- //b.setBackground(color);
- b.setFont(font);
- return b;
- }
- public JPanel makePanel(LayoutManager lm, Color c) {
- JPanel p = new JPanel();
- p.setLayout(lm);
- //p.setBackground(c);
- return p;
- }
- public void init() {//初始化GUI
- frame = new JFrame("MyCalculator");
- valueField = new JTextField(50);
- p1 = makePanel(new GridLayout(0,3,4,4),Color.lightGray);
- p2 = makePanel(new BorderLayout(6,2),Color.lightGray);
- p3 = makePanel(new BorderLayout(4,10),Color.lightGray);
- leftPanel = makePanel(new GridLayout(5,0,4,4),Color.lightGray);
- border = BorderFactory.createBevelBorder(BevelBorder.LOWERED);
- jlabel = new JLabel();//MC上方方框
- jlabel.setHorizontalAlignment(JLabel.CENTER);
- jlabel.setBorder(border);
- mc = makeButton("MC",colorBlue,f);//MC
- mc.setForeground(Color.RED);
- mc.addActionListener(this);
- mr = makeButton("MR",colorBlue,f);//MR
- mr.addActionListener(this);
- mr.setForeground(Color.RED);
- ms = makeButton("MS",colorBlue,f);//MS
- ms.addActionListener(this);
- ms.setForeground(Color.RED);
- ma = makeButton("M+",colorBlue,f);//M+
- ma.setForeground(Color.RED);
- ma.addActionListener(this);
- bs = makeButton("BackSpace",colorBlue,f);//BackSpace
- bs.addActionListener(this);
- ce = makeButton("CE",colorBlue,f);//CE
- ce.addActionListener(this);
- c = makeButton("C",colorBlue,f);//C
- c.addActionListener(this);
- midPanel = makePanel(new GridLayout(4,5,4,2),Color.lightGray );
- midButtons = new JButton[20];
- midButtons[0] = makeButton("7",colorBlue,f);//7
- midButtons[1] = makeButton("8",colorBlue,f);//8
- midButtons[2] = makeButton("9",colorBlue,f);//9
- midButtons[3] = makeButton("/",colorBlue,f);// '/'
- midButtons[3].setForeground(Color.RED);
- midButtons[4] = makeButton("sqrt",colorBlue,f);//sqrt
- midButtons[5] = makeButton("4",colorBlue,f);//4
- midButtons[6] = makeButton("5",colorBlue,f);//5
- midButtons[7] = makeButton("6",colorBlue,f);//6
- midButtons[8] = makeButton("*",colorBlue,f);//*
- midButtons[8].setForeground(Color.RED);
- midButtons[9] = makeButton("%",colorBlue,f);//%
- midButtons[10] = makeButton("1",colorBlue,f);//1
- midButtons[11] = makeButton("2",colorBlue,f);//3
- midButtons[12] = makeButton("3",colorBlue,f);//3
- midButtons[13] = makeButton("-",colorBlue,f);// -
- midButtons[13].setForeground(Color.RED);
- midButtons[14] = makeButton("1/x",colorBlue,f);//1/x
- midButtons[15] = makeButton("0",colorBlue,f);//0
- midButtons[16] = makeButton("+/-",colorBlue,f);// +/-
- midButtons[17] = makeButton(".",colorBlue,f);// .
- midButtons[18] = makeButton("+",colorBlue,f);// +
- midButtons[18].setForeground(Color.RED);
- midButtons[19] = makeButton("=",colorBlue,f);// =
- midButtons[19].setForeground(Color.RED);
- midPanel.setForeground(Color.BLUE);
- for(int i = 0; i<20;i++) {
- midPanel.add(midButtons[i]);
- midButtons[i].addActionListener(this);
- }
- leftPanel.add(jlabel);
- leftPanel.add(mc);
- leftPanel.add(mr);
- leftPanel.add(ms);
- leftPanel.add(ma);
- p1.add(bs,"West");
- p1.add(ce,"Center");
- p1.add(c,"East");
- p2.add(p1,"North");
- p2.add(midPanel,"Center");
- p3.add(leftPanel,"West");
- p3.add(p2,"Center");
- frame.addWindowListener(new WindowAdapter(){
- public void windowClosing(WindowEvent e){
- System.exit(0);}});
- valueField.setHorizontalAlignment(JTextField.RIGHT);
- valueField.setFont(new Font("Courier",Font.PLAIN ,15));
- valueField.setText(value);
- valueField.setEditable(false);
- frame.add(valueField,"North");
- frame.add(p3,"Center");
- frame.setLocation(200,200);
- frame.setSize(380, 250);
- frame.setResizable(false);
- clearCalc();//初始化
- frame.setVisible(true);
- }
- public void actionPerformed(ActionEvent e) {
- String s = (String)e.getActionCommand();//获取事件源
- if(hasError&"CE".indexOf(s)==-1)//如果错误尾处理
- return;
- if(digits.indexOf(s) != -1)
- handleDigit(s);//数字"0123456789"
- else if(s.equals("."))//小数点
- handleDecimal();
- else if(normalOperators.indexOf(s) != -1)
- handleNormalOperator(s);//"+-*/="
- else if(mathOperators.indexOf(s) != -1)
- handleMathOperator(s);//"+/-sqrt%1/x"
- else if(editOperators.indexOf(s) != -1)
- handleEditOperator(s);//"CECBackSpace"
- else if(memoryOperators.indexOf(s) != -1)
- handleMemoryOperator(s);//"MRMCMSM+"
- }
- private void handleDigit(String s)
- {//"0123456789"
- if(newOpd) {//新的数字
- valueField.setText(s);
- newOpd = false;
- }else {
- String vs = valueField.getText();
- System.out.println(vs);
- //if(vs.trim().equals("0"))
- valueField.setText(s);
- //else
- //valueField.setText(vs + s);
- }
- sawAnOpd = true;
- }
- private void clearCalc()
- {//清除数据
- sawDecimal =false;//小数点
- newOpd = true;//新数字
- sawAnOpd = false;//是否有操作数
- lastOptr = "";//操作码
- valueField.setText(value);
- hasError = false;//错误
- }
- private void handleNormalOperator(String s)
- {//"+-*/="
- if(!sawAnOpd)
- return;
- if(lastOptr.equals("+"))//+
- opd1 += getDisplay();
- else if(lastOptr.equals("-"))//-
- opd1 -= getDisplay();
- else if(lastOptr.equals("*"))//*
- opd1 *= getDisplay();
- else if(lastOptr.equals("/")){// '/'
- opd2 = getDisplay();
- if(opd2 == 0.0) {//除数为0
- handleError();
- return;
- }else
- opd1 /=opd2;
- }
- else
- opd1 = getDisplay();//=
- valueField.setText(opd1 + "");
- lastOptr = s;
- sawDecimal = false;
- newOpd = true;
- }
- private void handleError()
- {//处理错误
- System.out.println("Error");
- opd2 = getDisplay();
- hasError = true;
- valueField.setText("error");
- }
- private void handleMathOperator(String s)
- {//"+/-sqrt % 1/x";
- if(!sawAnOpd)
- return;
- if(s.equals("sqrt")) {//sqrt
- if((opd2=getDisplay())>=0)
- opd2 = Math.sqrt(opd2);
- else {//被开方数为负
- handleError();
- return;
- }
- }
- else if(s.equals("%"))//%
- opd2 = getDisplay()/100.0;
- else if(s.equals("1/x")){//1/x
- opd2 = getDisplay();
- if(opd2 == 0.0) {//操作数为0
- handleError();
- return;
- }
- else
- opd2 = 1/opd2;
- }
- else if(s.equals("+/-"))
- opd2 = -getDisplay();//操作数取反
- valueField.setText(opd2 + "");
- if(valueField.getText().indexOf(".")!=-1)
- sawDecimal = false;
- else
- sawDecimal = true;
- newOpd = false;
- }
- private void handleEditOperator(String s)
- {//"CECBackSpace";
- if(!sawAnOpd)
- return;
- if(s.equals("CE")) {//CE
- if(hasError) {
- hasError = false;
- valueField.setText(opd2 + "");
- }
- }
- else if(s.equals("BackSpace"))
- {//BackSpace
- String vs = valueField.getText();
- if(!newOpd)
- if((opd2 = getDisplay())!=0.0) {
- vs=vs.substring(0,vs.length()-1);
- if(vs.equals("")) {//已经清除完
- vs="0";
- newOpd = true;
- }
- valueField.setText(vs);
- if(vs.indexOf(".")!=-1)
- sawDecimal = false;
- else
- sawDecimal = true;
- return;
- }
- }
- else if(s.equals("C")) {//C
- clearCalc();
- }
- }
- private void handleMemoryOperator(String s)
- {//"MCMRMSM+";
- if(s.equals("MS")) {//MS
- storedMomery = getDisplay();
- jlabel.setText("M");
- }
- else if(s.equals("MR")) {//MR
- valueField.setText(storedMomery + "");
- newOpd = false;
- }
- else if(s.equals("MC")) {//MC
- storedMomery = 0.0;
- jlabel.setText("");
- }
- else if(s.equals("M+")) {//M+
- if(!newOpd)
- storedMomery += getDisplay();
- else storedMomery *= 2.0;
- }
- }
- private void handleDecimal()
- {//处理小数点
- if(!sawDecimal) {//还没有出现小数点
- if(newOpd) {
- valueField.setText("0.");
- newOpd = false;
- }else {
- valueField.setText(valueField.getText() + ".");
- }
- sawDecimal = true;
- }
- }
- private double getDisplay()
- {//取当前显示数据
- return Double.parseDouble(valueField.getText());
- }
- public static void main(String[] args) {
- new SwingCalculator().init();
- }
- private JFrame frame;
- private String value="0";
- private JTextField valueField;
- private Border border;
- private JLabel jlabel;
- private JPanel leftPanel;
- private JPanel midPanel;
- private JPanel p1;
- private JPanel p2;
- private JPanel p3;
- private JButton[] midButtons;
- private Color colorBlue = Color.LIGHT_GRAY;
- private Font f = new Font("Courier",Font.PLAIN ,12);
- private JButton mc,mr,ms,ma;
- private JButton bs,ce,c;
- static final String digits = "0123456789";
- static final String normalOperators = "+-*/=";
- static final String mathOperators = "+/-sqrt%1/x";
- static final String editOperators = "CECBackSpace";
- static final String memoryOperators = "MRMCMSM+";
- private String lastOptr;
- private double opd1,opd2;
- private double storedMomery = 0.0;
- private boolean sawDecimal,newOpd,sawAnOpd,hasError;
- }
- Java实现计算器----【完全自主完成】
- 使用java swing完成简单的计算器
- java实现计算器
- java实现的计算器
- JAVA实现简易计算器
- Java实现表达式计算器
- Java实现简单计算器
- java实现简易计算器
- JAVA计算器算法实现
- JAVA 实现预产期计算器
- 【Java】简单计算器实现
- JAVA实现简单计算器
- java实现阶层计算器
- java实现简易计算器
- java实现计算器
- java实现计算器
- java实现计算器
- java实现简单计算器
- PHP:Memcache 基础
- PHP:Windows下 Memcache 的安装
- 心泪
- 伤痕
- 戒指
- Java实现计算器----【完全自主完成】
- 第一次发发表日志
- MYSQL命令精华
- 汽车加油问题——一道迷惑的面试题
- 使用mysqldump进行Mysql 备份
- 很高兴来到这里
- HTML中属性ID和属性NAME有何区别?
- <!-- -->在浏览器的作用
- NetBeans6.8下JSF可视化入门(未完)