Java实现计算器——升级记录中19.5.14……
这是入门java以来的第一个小项目,希望可以从中学到东西,而不是单纯地懂得Swing的一些功能,持续更新中
/*************************************************************************/
19.5.14
//第一个类:主类
package Calculator_advance;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
public class Calculator_advance {public static void main(String[] args) {// TODO Auto-generated method stubnew WindowFlow("计算器");}
}//第二个类:布局
package Calculator_advance;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;public class WindowFlow extends JFrame implements ActionListener{JMenuBar menubar;JMenu menu;JMenuItem item1,item2,item3;JLabel inputScreen = new JLabel();int count=0;String str;static int choose=0;WindowFlow(String s){setTitle(s); setBounds(100,100,300,450);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//第一种:菜单选择menubar = new JMenuBar();menu = new JMenu("模式选择");item1 = new JMenuItem("基本型");item2 = new JMenuItem("科学型");item3 = new JMenuItem("关闭");menu.add(item1);menu.add(item2);menu.add(item3);menubar.add(menu);setJMenuBar(menubar);inputScreen.setSize(280,100);add(inputScreen,BorderLayout.NORTH);inputScreen.setText("0");inputScreen.setFont(new Font("SERIF",Font.BOLD,40));inputScreen.setHorizontalAlignment(JLabel.RIGHT);inputScreen.setBorder(BorderFactory.createLineBorder(Color.black));JPanel ButtonContainer = new JPanel();add(ButtonContainer);String Buttonnumbers[] = {"7","8","9","+", "4","5","6","-", "1","2","3","*", "0",".","/","=","clear"};for(String string:Buttonnumbers){JButton b = new JButton(string);if(string !="clear")b.setPreferredSize(new Dimension(60,60));else b.setPreferredSize(new Dimension(240,60));ButtonContainer.add(b);b.addActionListener(this);}setVisible(true); validate();/** 事件处理*/item1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) { choose=1;System.out.println(choose);}});item2.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) { choose=2;System.out.println(choose);}});item3.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {System.exit(0);}}); }@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubMathSampleOperation Math =new MathSampleOperation();count++;if(count==1)inputScreen.setText("");//不显示0if(e.getActionCommand()!="=")inputScreen.setText(inputScreen.getText()+e.getActionCommand());else {inputScreen.setText(inputScreen.getText()+"="+Math.eval(inputScreen.getText()));}if(e.getActionCommand().equals("clear")==true){inputScreen.setText("0");count=0;}}
}//第三个类:算术操作
package Calculator_advance;public class MathSampleOperation {public String str;public double numa,numb;public double eval(String str)//此处划分可以再优化{String[] strnum = str.split("[\\p{Punct}]+");//\n 6\n9String[] strstr = str.split("[\\d]+");// \n +numa = Double.parseDouble(strnum[0]);numb = Double.parseDouble(strnum[1]); switch (strstr[1]) {case "+":return numa+numb;case "-":return numa-numb;case "*":return numa*numb;case "/":return numa/numb;default:return Math.E;} }
}
效果如图:
上面主要实现的仅仅是基本型的整体布局和简单的两个数之间的运算!
接下来就需要不断完善功能啦,我会分时间段来完善,希望最后呈现给大家的是一个功能齐全的计算器!
/*************************************************************************/
19.5.15——>主要实现了基本型的混合运算,只改了混合型运算的代码
//仅改动了第三个类——算术操作类(但这个方法比较麻烦,而且实现过程中自己忽略了一些知识点,导致找了很久)
//String类型的比较一定要用str.equals();不能用'=='
我开始习惯性地用了'==',之后过程测试中发现出现并没有进入条件语句中
package Calculator_advance;import java.util.Scanner;public class MathSampleOperation {public String str;public double eval(String str)//此处划分可以再优化{int i,k=0,count=0;double sum=0;double[] number = new double[20];String[] strArray =new String[20];double[] newnumber = new double[20];String[] newstrArray =new String[20];String[] strnum = str.split("[\\p{Punct}]+");String[] strstr = str.split("[\\d]+");//输出部分为过程测试for(i=0;i<strnum.length;i++) //数字串{number[i] = Double.parseDouble(strnum[i]);
// System.out.print(number[i]+" ");}
// System.out.println();for(i=0;i<strstr.length-1;i++) //字符串{strArray[i] = strstr[i+1];
// System.out.print(strArray[i]+" "); }
// System.out.println();//String类型的比较一定要用str.equals();不能用'=='for(i=0;i<strstr.length-1;i++){ if((strArray[i].equals("*") || strArray[i].equals("/")) && count==0){sum=sum+number[i];count++;switch(strArray[i]){case "*":sum=sum*number[i+1];break;case "/":sum=sum/number[i+1];break;} }else if((strArray[i].equals("*") || strArray[i].equals("/")) && count!=0){ switch(strArray[i]){case "*":sum=sum*number[i+1];break;case "/":sum=sum/number[i+1];break;default:break;}}else if(!strArray[i].equals("*") && !strArray[i].equals("/") && i!=0 && count==0){newnumber[k]=number[i];newstrArray[k]=strArray[i];k++;sum=0;count=0;}else if(!strArray[i].equals("*") && !strArray[i].equals("/") && i!=0 && count!=0){newnumber[k]=sum;newstrArray[k]=strArray[i];k++;sum=0;count=0;}else if(!strArray[i].equals("*") && !strArray[i].equals("/") && i==0){newnumber[k]=number[0];newstrArray[k]=strArray[0];k++;}} //测试成功
// for(i=0;i<k;i++)
// {
// System.out.println(newnumber[i]);
// }
// for(i=0;i<k;i++)
// {
// System.out.println(newstrArray[i]);
// }
// System.out.println("k="+k);
// System.out.println();//接下来做加法和减法double total=0;for(i=0;i<k;i++){if(i==0)total=newnumber[0];else {switch(newstrArray[i-1]){case "+":total=total+newnumber[i];break;case "-":total=total-newnumber[i];break;}}}return total;} }
思想是什么呢?
1 .首先不考虑括号存在的情况, 对数值和操作符划分好以后,先处理乘除运算;
2 .当遇到加减运算符时,将运算后的结果和存入一个新的数值数组中,加减运算符也存入一个新的运算符数组中;
3. 处理加减运算符,只要一遍循环就可处理了
思考这个过程:大体上乘除和加减就只有两种分布,*/+即乘除连续,*+/即乘除间断
,但需要很多判断,容易出错,而且这个算法的时间复杂度应该是O(n)吧!
效果图:![](/assets/blank.gif)
上面主要实现的多个数之间的运算
接下来会接着实现基本型和科学性之间的页面切换,继续努力啦!
/*************************************************************************/
19.5.16——>只对基本型代码混合运算部分进行了整理,让人看的更清晰些;
package Calculator_advance;import java.util.Scanner;public class MathSampleOperation {public String str;public double eval(String str)//此处划分可以再优化{int i;int k=0; //新操作符数组的操作符个数int count=0; //次数标记double sum=0; //乘除过程中的和double[] number = new double[20];String[] strArray =new String[20];double[] newnumber = new double[20]; //新数值数组String[] newstrArray =new String[20]; //新操作符数组-只含有 + -String[] strnum = str.split("[\\p{Punct}]+");String[] strstr = str.split("[\\d]+");/**********输出部分均为分步过程测试***********/for(i=0;i<strnum.length;i++) //数字串{number[i] = Double.parseDouble(strnum[i]);
// System.out.print(number[i]+" ");}
// System.out.println();for(i=0;i<strstr.length-1;i++) //字符串{strArray[i] = strstr[i+1];
// System.out.print(strArray[i]+" "); }
// System.out.println();/*总结:* 1.String类型的比较一定要用 str.equals():先比较地址,再比较内容* '=='比较的是引用的地址* 2.分步检查* 3.代码重构* 4.寻找、学习新方法*//************先处理乘除*************/for(i=0;i<strstr.length-1;i++){ /*************************/if((strArray[i].equals("*") || strArray[i].equals("/"))){if(count==0){sum=sum+number[i];count++;switch(strArray[i]){case "*":sum=sum*number[i+1];break;case "/":sum=sum/number[i+1];break;default:break;} }else //count!=0{switch(strArray[i]){case "*":sum=sum*number[i+1];break;case "/":sum=sum/number[i+1];break;default:break;}}}/*************************/else if(!strArray[i].equals("*") && !strArray[i].equals("/")){if(i!=0){if(count==0){newnumber[k]=number[i];newstrArray[k]=strArray[i];k++;sum=0;count=0;}else //count!=0{newnumber[k]=sum;newstrArray[k]=strArray[i];k++;sum=0;count=0;}}else //i==0{newnumber[k]=number[0];newstrArray[k]=strArray[0];k++;} }} //for循环结束 //测试成功
// for(i=0;i<k;i++)
// {
// System.out.println(newnumber[i]);
// }
// for(i=0;i<k;i++)
// {
// System.out.println(newstrArray[i]);
// }
// System.out.println("k="+k);
// System.out.println();/************处理加减********/double total=0;for(i=0;i<k;i++){if(i==0)total=newnumber[0];else {switch(newstrArray[i-1]){case "+":total=total+newnumber[i];break;case "-":total=total-newnumber[i];break;}}}return total;} }
/*************************************************************************/
19.5.19——>对欢迎界面和科学型的界面进行了完善,整体代码改动较大;以下是最新版本下的所有.java项目
//main函数
package Calculator_advance;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
public class Calculator_advance {public static void main(String[] args) {// TODO Auto-generated method stubnew Windows("计算器");}
}//欢迎界面面板
package Calculator_advance;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;public class Windows extends JFrame{JMenuBar menubar;JMenu menu;JMenuItem item1,item2,item3;static int choose=0;//添加个人信息面盘JPanel Information = new JPanel();JLabel User =new JLabel("徐铭骏");JLabel ID =new JLabel("1170230039");// JTextArea 允许多行编辑JTextArea HelloText = new JTextArea("Hello, welcome to use! "+"Choose the left upper corner",100,100);public Windows(String string) {// TODO Auto-generated constructor stubsetTitle(string);setBounds(100,100,300,450);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//第一种:菜单选择menubar = new JMenuBar();menu = new JMenu("模式选择");item1 = new JMenuItem("基本型",new ImageIcon("open.PNG"));item2 = new JMenuItem("科学型",new ImageIcon("open.PNG"));item3 = new JMenuItem("退出",new ImageIcon("close.PNG"));menu.add(item1);menu.add(item2);menu.add(item3);menubar.add(menu);setJMenuBar(menubar);//欢迎面盘HelloText.setFont(new Font("SERIF",Font.BOLD,30));HelloText.setLineWrap(true); //设置多行文本框自动换行add(HelloText);//个人信息add(Information,BorderLayout.SOUTH);String ButtonInformation[] = {"User:徐铭骏","ID:1170230039"};for(String string1:ButtonInformation){JButton b = new JButton(string1);b.setPreferredSize(new Dimension(120,60));Information.add(b);}/** 菜单栏事件处理*/item1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) { Panel1 panel1 = new Panel1("基本型");}});item2.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) { Panel2 panel2 = new Panel2("科学型");}});item3.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {System.exit(0);}}); setVisible(true); validate();}}//基本型界面面板
package Calculator_advance;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;public class Panel1 extends JFrame implements ActionListener{JLabel inputScreen = new JLabel();int count=0;String str;Windows window1 = new Windows("计算器");Panel1(String s){setTitle(s); setBounds(100,100,300,450);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); inputScreen.setSize(280,100);add(inputScreen,BorderLayout.NORTH);inputScreen.setText("0");inputScreen.setFont(new Font("SERIF",Font.BOLD,40));inputScreen.setHorizontalAlignment(JLabel.RIGHT);inputScreen.setBorder(BorderFactory.createLineBorder(Color.black));JPanel ButtonContainer = new JPanel();add(ButtonContainer);String Buttonnumbers[] = {"7","8","9","+", "4","5","6","-", "1","2","3","*", "0",".","/","=","clear","reset"};for(String string:Buttonnumbers){JButton b = new JButton(string);if(string !="clear" && string !="reset")b.setPreferredSize(new Dimension(60,60));else b.setPreferredSize(new Dimension(120,60));ButtonContainer.add(b);b.addActionListener(this);}setVisible(true); validate(); }@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubMathSampleOperation MathSam =new MathSampleOperation();count++;if(count==1)inputScreen.setText("");//不显示0if(e.getActionCommand()!="=")inputScreen.setText(inputScreen.getText()+e.getActionCommand());else {inputScreen.setText(inputScreen.getText()+"=");inputScreen.setText(inputScreen.getText()+MathSam.eval(inputScreen.getText()));}if(e.getActionCommand().equals("clear")==true){inputScreen.setText("0");count=0;}if(e.getActionCommand().equals("reset")==true){Windows window1 = new Windows("计算器");//但操作过多就会有很多的对象,内存占用,所以这里可以优化}}
}//科学型界面面板
package Calculator_advance;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;public class Panel2 extends JFrame implements ActionListener{JLabel inputScreen = new JLabel();int count=0;String str;Panel2(String s){setTitle(s); setBounds(100,100,300,450);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); inputScreen.setSize(280,100);add(inputScreen,BorderLayout.NORTH);inputScreen.setText("0");inputScreen.setFont(new Font("SERIF",Font.BOLD,30));inputScreen.setHorizontalAlignment(JLabel.RIGHT);inputScreen.setBorder(BorderFactory.createLineBorder(Color.black));JPanel ButtonContainer = new JPanel();add(ButtonContainer);String Buttonnumbers[] = {"clear","reset","sqrt","abs","sin","cos", "log","(",")","-","6","7","8","9","2","3","4","5","0","1",".","="};for(String string:Buttonnumbers){JButton button = new JButton(string);if(string =="clear" || string =="reset")button.setPreferredSize(new Dimension(120,50));else if(string !="clear" && string!="0" && string!="1" && string!="=" &&string!="reset" &&string!="-")button.setPreferredSize(new Dimension(60,50));elsebutton.setPreferredSize(new Dimension(60,50)); ButtonContainer.add(button);button.addActionListener(this);}setVisible(true); validate(); }@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubMathComplexOperation MathCom =new MathComplexOperation();count++;if(count==1)inputScreen.setText("");//不显示0if(e.getActionCommand()!="=")inputScreen.setText(inputScreen.getText()+e.getActionCommand());else {inputScreen.setText(inputScreen.getText()+"=");inputScreen.setText(inputScreen.getText()+MathCom.eval(inputScreen.getText()));}if(e.getActionCommand().equals("clear")==true){inputScreen.setText("0");count=0;}if(e.getActionCommand().equals("reset")==true){Windows window2 = new Windows("计算器");//但操作过多就会有很多的对象,内存占用,所以这里可以优化}} }//基本型算术运算操作类
package Calculator_advance;import java.util.Scanner;public class MathSampleOperation {public String str;public double eval(String str)//此处划分可以再优化{int i;int k=0; //新操作符数组的操作符个数int count=0; //次数标记double sum=0; //乘除过程中的和double[] number = new double[20];String[] strArray =new String[20];double[] newnumber = new double[20]; //新数值数组String[] newstrArray =new String[20]; //新操作符数组-只含有 + -String[] strnum = str.split("[\\p{Punct}]+");String[] strstr = str.split("[\\d]+");/**********输出部分均为分步过程测试***********/for(i=0;i<strnum.length;i++) //数字串{number[i] = Double.parseDouble(strnum[i]);
// System.out.print(number[i]+" ");}
// System.out.println();for(i=0;i<strstr.length-1;i++) //字符串{strArray[i] = strstr[i+1];
// System.out.print(strArray[i]+" "); }
// System.out.println();/*总结:* 1.String类型的比较一定要用 str.equals():先比较地址,再比较内容* '=='比较的是引用的地址* 2.分步检查* 3.代码重构* 4.寻找、学习新方法*//************先处理乘除*************/for(i=0;i<strstr.length-1;i++){ /*************************/if((strArray[i].equals("*") || strArray[i].equals("/"))){if(count==0){sum=sum+number[i];count++;switch(strArray[i]){case "*":sum=sum*number[i+1];break;case "/":sum=sum/number[i+1];break;default:break;} }else //count!=0{switch(strArray[i]){case "*":sum=sum*number[i+1];break;case "/":sum=sum/number[i+1];break;default:break;}}}/*************************/else if(!strArray[i].equals("*") && !strArray[i].equals("/")){if(i!=0){if(count==0){newnumber[k]=number[i];newstrArray[k]=strArray[i];k++;sum=0;count=0;}else //count!=0{newnumber[k]=sum;newstrArray[k]=strArray[i];k++;sum=0;count=0;}}else //i==0{newnumber[k]=number[0];newstrArray[k]=strArray[0];k++;} }} //for循环结束 //测试成功
// for(i=0;i<k;i++)
// {
// System.out.println(newnumber[i]);
// }
// for(i=0;i<k;i++)
// {
// System.out.println(newstrArray[i]);
// }
// System.out.println("k="+k);
// System.out.println();/************处理加减********/double total=0;for(i=0;i<k;i++){if(i==0)total=newnumber[0];else {switch(newstrArray[i-1]){case "+":total=total+newnumber[i];break;case "-":total=total-newnumber[i];break;}}}return total;} }//科学型运算操作类
package Calculator_advance;public class MathComplexOperation {public String str;public double number;public double eval(String str){String[] strs = str.split("[()]"); number = Double.parseDouble(strs[1]);switch (strs[0]) {case "sin":return Math.sin(number);case "cos":return Math.cos(number);case "log":return Math.log(number);case "abs":return Math.abs(number);case "sqrt":return Math.sqrt(number);default:return Math.E;} }
}
第一张图短一些,因为有些信息在,不方便显示,所以就截掉了
/*************************************************************************/
19.5.24:
上面的程序实际跑出来后可以知道,每一次的reset,每一次的切换界面都会生成新的对象,导致后期内存负担增加,经过和别人交流,再次改进界面,不改动运算处理的两个类,主要是通过Container类来实现面板的切换的;
//主函数
package Calculator_advance;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
public class Calculator_advance {JMenuBar menubar;JMenu menu;JMenuItem item1,item2,item3;public static void main(String[] args) {new Windows();}
}//windows类
package Calculator_advance;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;public class Windows extends JFrame {JMenuBar menubar;JMenu menu;JMenuItem item1,item2,item3;JLabel inputScreen = new JLabel();int count=0; //无数据时显示0的标志位String str;
// JTextArea 允许多行编辑JTextArea HelloText = new JTextArea("Hello, welcome to use! "+"Choose the left upper corner",100,100);public Windows() {setBounds(100,100,300,470);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//第一种:菜单选择menubar = new JMenuBar();menu = new JMenu("模式选择");item1 = new JMenuItem("基本型",new ImageIcon("open.PNG"));item2 = new JMenuItem("科学型",new ImageIcon("open.PNG"));item3 = new JMenuItem("退出",new ImageIcon("close.PNG"));menu.add(item1);menu.add(item2);menu.add(item3);menubar.add(menu);setJMenuBar(menubar);inputScreen.setSize(280,100);add(inputScreen,BorderLayout.NORTH);inputScreen.setText("0");inputScreen.setFont(new Font("SERIF",Font.BOLD,40));inputScreen.setHorizontalAlignment(JLabel.RIGHT);inputScreen.setBorder(BorderFactory.createLineBorder(Color.black)); JPanel ButtonContainer = new JPanel();//Panel1JPanel panel1 = new JPanel();setTitle("基本型"); String Buttonnumbers[] = {"7","8","9","+", "4","5","6","-", "1","2","3","*", "0",".","/","=","(",")","←","C",};for(String string:Buttonnumbers){JButton b = new JButton(string);b.setPreferredSize(new Dimension(60,60));panel1.add(b);//添加组件b.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent e) {MathSampleOperation MathSam =new MathSampleOperation();count++;if(count==1)inputScreen.setText(e.getActionCommand());//直接显示键值 else {if(e.getActionCommand()=="="){inputScreen.setText(inputScreen.getText()+"=");inputScreen.setText(inputScreen.getText()+MathSam.eval(inputScreen.getText()));} else if(e.getActionCommand().equals("C")==true){inputScreen.setText("0");count=0;}else if(e.getActionCommand().equals("←")==true){String str = inputScreen.getText(); if(str.length() - 1 > 0){str = str.substring(0,str.length() - 1);//提取字符串从start-end的字符inputScreen.setText(str);count=0;}else inputScreen.setText("0");}else inputScreen.setText(inputScreen.getText()+e.getActionCommand());}} });}//panel2JPanel panel2 = new JPanel(); setTitle("科学型"); String Buttonnumbers_Panel2[] = {"C","←","sqrt","abs","sin","cos", "log","(",")","-","6","7","8","9","2","3","4","5","0","1",".","="};for(String string:Buttonnumbers_Panel2){JButton button = new JButton(string);if(string =="C" || string=="←")button.setPreferredSize(new Dimension(120,50));elsebutton.setPreferredSize(new Dimension(60,50)); panel2.add(button);//组件监听button.addActionListener(new ActionListener() { @Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubMathComplexOperation MathCom =new MathComplexOperation(); count++;if(count==1){if(e.getActionCommand().equals("←")==false)inputScreen.setText(e.getActionCommand());//不显示0else{inputScreen.setText("0");//显示0count=0;}}else {if(e.getActionCommand().equals("C")==true){inputScreen.setText("0");count=0; }else if(e.getActionCommand().equals("←")==true){String str = inputScreen.getText(); if(str.length() - 1 > 0){str = str.substring(0,str.length() - 1);//提取字符串从start-end的字符inputScreen.setText(str);}else {inputScreen.setText("0");count=0; } } else if(e.getActionCommand().equals("=")==true){inputScreen.setText(inputScreen.getText()+"=");inputScreen.setText(inputScreen.getText()+MathCom.eval(inputScreen.getText()));}elseinputScreen.setText(inputScreen.getText()+e.getActionCommand());} }});} validate();//初始化界面 Container currentPanel = getContentPane(); currentPanel.add(panel1); /** 菜单栏事件处理*/item1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) { currentPanel.remove(panel2);currentPanel.add(panel1);currentPanel.revalidate();currentPanel.repaint();}});item2.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) { currentPanel.remove(panel1);;currentPanel.add(panel2);currentPanel.revalidate();currentPanel.repaint();}});item3.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {System.exit(0);//退出}}); setVisible(true); validate();}
}
/*************************************************************************/
19.5.25
初步学习《代码重构》发现自己的window类里内容太多,功能不专一,且不适合于改动。
重构的本质——>
1. “重构技术就是以微小的步伐修改程序,如果你犯下错误,很容易便可以发现它”;
2. “变量名称是代码清晰的关键”;
3. “代码应该表现自己的目的”,每一个类都应该有自己最主要的功能
两个运算操作的类不变
//主函数
package calculatorRefactor;public class Calculator {public static void main(String[] args) {new WindowsInit(); //面盘初始化并选择}}//第一个类
/** 初始化面盘内容并选择*/
package calculatorRefactor;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;public class WindowsInit extends JFrame {JMenuBar menubar;JMenu menu;JMenuItem item1,item2,item3;JLabel inputScreen = new JLabel();int count=0; //无数据时显示0的标志位String str; static int chooseFlag=1;//静态变量需要类名引用——>基本型和科学型转换public WindowsInit() {setBounds(100,100,300,470);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/** 菜单选择模式*/menubar = new JMenuBar();menu = new JMenu("模式选择");item1 = new JMenuItem("基本型",new ImageIcon("open.PNG"));item2 = new JMenuItem("科学型",new ImageIcon("open.PNG"));item3 = new JMenuItem("退出",new ImageIcon("close.PNG"));menu.add(item1);menu.add(item2);menu.add(item3);menubar.add(menu);setJMenuBar(menubar);inputScreen.setSize(280,100);add(inputScreen,BorderLayout.NORTH);inputScreen.setText("0");inputScreen.setFont(new Font("SERIF",Font.BOLD,40));inputScreen.setHorizontalAlignment(JLabel.RIGHT);inputScreen.setBorder(BorderFactory.createLineBorder(Color.black)); /** Panel1初始化*/JPanel panel1 = new JPanel();setTitle("基本型"); PanelComponent panel = new PanelComponent(inputScreen);panel.panel1(panel1, inputScreen);/** panel2初始化*/JPanel panel2 = new JPanel(); setTitle("科学型"); panel.panel2(panel2, inputScreen);/** 初始化界面选择 */Container currentPanel = getContentPane(); currentPanel.add(panel1);/** 菜单栏事件处理*/item1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) { currentPanel.remove(panel2);currentPanel.add(panel1);currentPanel.revalidate();currentPanel.repaint();WindowsInit.chooseFlag=1;//基本型运算}});item2.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) { currentPanel.remove(panel1);;currentPanel.add(panel2);currentPanel.revalidate();currentPanel.repaint();WindowsInit.chooseFlag=2;//科学型运算}});item3.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {System.exit(0);//退出}}); /** 面盘显示*/setVisible(true); validate();}
}//第二个类
/** 面盘组件添加类,封装成函数*/
package calculatorRefactor;import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;public class PanelComponent extends JFrame implements ActionListener{int count=0;private JLabel inputScreen; SampleOperation MathSam =new SampleOperation();ComplexOperation MathCom =new ComplexOperation();/** panel1组件*/PanelComponent(JLabel inputScreen){this.inputScreen=inputScreen;}public void panel1(JPanel panel1,JLabel inputScreen){ String Buttonnumbers[] = {"7","8","9","+", "4","5","6","-", "1","2","3","*", "0",".","/","=","(",")","←","C",}; for(String string:Buttonnumbers){JButton b = new JButton(string);b.setPreferredSize(new Dimension(60,60));panel1.add(b);//添加组件b.addActionListener(this); } }/** panel2组件*/public void panel2(JPanel panel2,JLabel inputScreen){String Buttonnumbers_Panel2[] = {"C","←","sqrt","abs","sin","cos", "log","(",")","-","6","7","8","9","2","3","4","5","0","1",".","="};for(String string:Buttonnumbers_Panel2){JButton button = new JButton(string);if(string =="C" || string=="←")button.setPreferredSize(new Dimension(120,50));elsebutton.setPreferredSize(new Dimension(60,50)); panel2.add(button);button.addActionListener(this); }}/** 事件监听*/@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubcount++;if(count==1){if(e.getActionCommand().equals("←")==false)inputScreen.setText(e.getActionCommand());//不显示0else{inputScreen.setText("0");//显示0count=0;}}else {if(e.getActionCommand().equals("C")==true){inputScreen.setText("0");count=0; }else if(e.getActionCommand().equals("←")==true){String str = inputScreen.getText(); if(str.length() - 1 > 0){str = str.substring(0,str.length() - 1);//提取字符串从start-end的字符inputScreen.setText(str);}else {inputScreen.setText("0");count=0; } } //基本型和科学型的运算转换 WindowsInit.chooseFlagelse if(e.getActionCommand().equals("=")==true && WindowsInit.chooseFlag==2){inputScreen.setText(inputScreen.getText()+"=");inputScreen.setText(inputScreen.getText()+MathCom.eval(inputScreen.getText()));}else if(e.getActionCommand().equals("=")==true && WindowsInit.chooseFlag==1){inputScreen.setText(inputScreen.getText()+"=");inputScreen.setText(inputScreen.getText()+MathSam.eval(inputScreen.getText()));}elseinputScreen.setText(inputScreen.getText()+e.getActionCommand());}}
}//基本型操作运算类(沿用以前)//科学型操作运算类(沿用以前)
/*************************************************************************/
改进加入括号的算法:
浏览其网上他人的实现过程,发现其实有一种更普遍和接受的算法,即后缀表达式/逆波兰式;
打算有时间尝试一下
Java实现计算器——升级记录中19.5.14……相关推荐
- Java面试题(自己不会的查大佬的贴,持续记录中)
目录 1.Java运算符优先级... 9 2.HTML,JS,CSS的区别... 10 1.HTML-Hypertext Markup Language. 10 2.CSS-Cascading Sty ...
- Java实现CRM项目过程中的细节记录(一)
CRM项目实现过程中的细节记录(一) 文章目录 CRM项目实现过程中的细节记录(一) 一.数据库相关细节 1. 表名 2. 表字段说明 3. 不使用主外键约束 4. 不使用主键自动增长 UUID 5. ...
- 获取mysql可行方法_Mysql学习Java实现获得MySQL数据库中所有表的记录总数可行方法...
<Mysql学习Java实现获得MySQL数据库中所有表的记录总数可行方法>要点: 本文介绍了Mysql学习Java实现获得MySQL数据库中所有表的记录总数可行方法,希望对您有用.如果有 ...
- java log日志函数_Java 中的 AWS Lambda 函数日志记录 - AWS Lambda
AWS 文档中描述的 AWS 服务或功能可能因区域而异.要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门. 本文属于机器翻译版本.若本译文内容与英语原文存在差异,则一律以英文原文为准. Ja ...
- JAVA实验三:输出点菜记录中每种菜的价格及总价格
题目 假设某餐馆中每桌顾客点菜记录的格式为"北京烤鸭:189 西芹百合:15 清蒸鲈鱼:80"(每道菜的价格与下一道菜的名字之间有一个空格).编写一个类的方法,能够接受键盘录入的符 ...
- Java面试-2021Gaoven-持续更新中
Java面试 一.基础 1.&&和&的区别? |和||的区别? 1.当符号左边是false时,&继续执行符号右边的运算.&&不再执行符号右边的运算. 2 ...
- 【狂人小白】如何将Java项目发布到Maven中
将Java项目发布到Maven中 如何通过Sonatype进行发布Maven操作,并且能够在http://search.maven.org 中搜索到 关键步骤: 1. 申请OSS账号 2. 通过gpg ...
- java 异常处理发生异常_Java中的异常处理
java 异常处理发生异常 Exception Handling in Java is a very interesting topic. Exception is an error event th ...
- JAVA面试大全(持续更新中...)
本文旨在收集Java面试过程中出现的问题,力求全面,仅作学习交流,欢迎补充,持续更新中-,部分段落选取自网上,部分引用文章已标注,部分已记不清了,如侵权,联系本人 Java基础 1.面向对象的概述 面 ...
最新文章
- 《精通Python设计模式》学习结构型之MVC模式
- GMM(Gaussian mixture model, 高斯混合模型)
- 根目录_Linux Shell从入门到删除根目录跑路指南
- javascript 之---正则表达式
- JavaSE各阶段练习题----集合-Collection-Set-List
- 千分之三用计算机怎么算,浓度换算计算器(浓度单位换算器在线使用)
- 【Silverlight5矢量打印】如何用C#代码检测打印机和驱动是否支持PostScript
- Bumblebee微服务网关之Url重写
- P4231 三步必杀 二次差分
- DNS的A、CNAME、MX、NS、TXT、SPF记录
- 使用phpize建立php扩展(Cannot find config.m4)
- STM32:关于DMA,TCM(ITCM和DTCM)和Cache的理解
- 信息图表是如何炼成的(三):阶层结构与isometric
- openSUSE 跨版本升级
- 不同cpu服务器虚拟迁移,虚拟机迁移时,提示CPU不兼容问题求解,谢谢!
- windows系统mysql常用命令_Windows下 MySQL命令 常用操作
- 计算机教育硕士专业代码,硕士专业代码查询
- quartz问题记录-missed their scheduled fire-time
- hdu5956, The Elder (树型dp, 斜率优化)
- MATLAB 常用函数学习笔记