diff --git a/src/java2020spring/Calculator.java b/src/java2020spring/Calculator.java new file mode 100644 index 0000000000000000000000000000000000000000..1da2994cb5b7d5e101211d9ade50f920ac1ed95e --- /dev/null +++ b/src/java2020spring/Calculator.java @@ -0,0 +1,36 @@ +package java2020spring; + +import java.awt.Dimension; +import java.awt.Toolkit; + +import javax.swing.JFrame; + +public class Calculator { + + public static void main(String[] args) { + CalculatorFrame frame=new CalculatorFrame(); + + + + frame.setSize(500,700); + frame.setLocationRelativeTo(null);//窗口居中 ② + frame.setTitle("计算器 : 我现在还不能连续计算噢~"); + frame.setVisible(true); + frame.setResizable(true);//允许修改窗口大小 + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + + //窗口居中 ① +// int FRAME_Width=500; +// int FRAME_Height=700; +// int SCREEN_Width=Toolkit.getDefaultToolkit().getScreenSize().width;//得到屏幕的宽 +// int SCREEN_Height=Toolkit.getDefaultToolkit().getScreenSize().height;//得到屏幕的高 +// int frame_x=(SCREEN_Width-FRAME_Width)/2;//窗口横坐标 +// int frame_y=(SCREEN_Height-FRAME_Height)/2; //纵坐标 +// frame.setSize(FRAME_Width,FRAME_Height); +// frame.setLocation(frame_x, frame_y); +// //↑↑↑↑窗口居中 + + } + +} diff --git a/src/java2020spring/CalculatorFrame.java b/src/java2020spring/CalculatorFrame.java new file mode 100644 index 0000000000000000000000000000000000000000..6d744d3b5695a12055737f7ee1ee2695cafaacaf --- /dev/null +++ b/src/java2020spring/CalculatorFrame.java @@ -0,0 +1,393 @@ +package java2020spring; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.*; + + +public class CalculatorFrame extends JFrame { + + public CalculatorFrame() { + this.initStandard(); + } + + + /* + * 以下:标准型计算器: + * 窗口北面添加文本域,计算机的类型“标准型” + * 窗口中间添加了面板,面板布置为GridLayout 格式为6行4列,用来放置24个计算所用的按钮 + * 为按钮设计监听 + * 各种操作符号的运算,及错误时对话框的弹出的设定 + * 另外还有字体颜色的添加等细节 + * */ + + + public void initStandard() { + + JTextArea textArea; + JPanel panelWangge;//面板,网格 + JMenu leixing; //菜单,类型 + JMenuBar menubar; + Font f; //文本域字体 + + leixing=new JMenu("标准型"); //显示计算器类型 + menubar=new JMenuBar(); + menubar.add(leixing); + setJMenuBar(menubar); + + textArea=new JTextArea(6,4); + add(textArea,BorderLayout.NORTH); //把文本域添加到北面 + f=new Font("幼圆",Font.BOLD,30); //设计文本域里的字号 + textArea.setFont(f); + + panelWangge=new JPanel(); //面板,将来放按钮 + panelWangge.setLayout(new GridLayout(7,4)); + JButton []standardButton=new JButton[28];//28个 按纽 + + String str[]= { + "ln","lg","2^x","e^x", + "%","√","x^2","x^3", + "C","del","1/x","÷", + "7","8","9","×", + "4","5","6","-", + "1","2","3","+", + "±","0",".","=" + }; + + for(int i=0;i=12&&i<28) { //12到28的按钮,其中右边的那一列按钮颜色设为 颜色2 + if((i+1)%4==0) { + standardButton[i].setBackground(color2); + } + else { + standardButton[i].setBackground(Color.WHITE); + + } + } + + if(i==28) { //最后一个按钮设为 颜色1 + standardButton[i].setBackground(color1); + } + // *********************设计字体颜色到此结束****************** + + standardButton[i].addActionListener(new ActionListener() { //为按钮设置监听器 + /* + * 按下等号之后得到文本域中的一串字符 + * 因为设定一次只能计算两位数字,所以以+,—,×,÷,%作为分隔符号时, + * 返回数组中的只有operationalNumber[0]和operationalNumber[1]两个参数 + * 再将两个String型的参数转换成Double型就可以进行计算了 + * + * */ + public void actionPerformed(ActionEvent e) { + + double result=0; //运算结果 + String []operationalNumber; //数组,装两个要进行运算的数字 + String textAreaContent=textArea.getText(); //文本域的内容 + StringTokenizer operationalSymbol=new StringTokenizer(textAreaContent,"0123456789."); //运算符号 + + + if(clickString.equals("=")) { + //如果不是连续的加减乘除等的运算,即以数字作为分隔的时候运算符的数目为1,就执行以下操作 + if(operationalSymbol.countTokens()==1) { + + if((operationalNumber=textAreaContent.split("\\+")).length==2) {//如果运算的数字有两个,并且分隔的符号是“+”则进行以下运算 + result=Double.parseDouble(operationalNumber[0])+Double.parseDouble(operationalNumber[1]); + textArea.setText(result+""); + } + else if((operationalNumber=textAreaContent.split("\\-")).length==2) { + result=Double.parseDouble(operationalNumber[0])-Double.parseDouble(operationalNumber[1]); + textArea.setText(result+""); + + } + else if((operationalNumber=textAreaContent.split("\\×")).length==2) { + result=Double.parseDouble(operationalNumber[0])*Double.parseDouble(operationalNumber[1]); + textArea.setText(result+""); + + } + else if((operationalNumber=textAreaContent.split("\\÷")).length==2) { + + if(Double.parseDouble(operationalNumber[1])!=0) { + result=Double.parseDouble(operationalNumber[0])/Double.parseDouble(operationalNumber[1]); + textArea.setText(result+""); + } + //建立了一个对话框对分母为零的情况进行警告 + else { + JOptionPane.showMessageDialog( textArea, "分母不能为0,不能计算噢~","警告", + JOptionPane.WARNING_MESSAGE, null); + textArea.setText(""); + } + } + + else if((operationalNumber=textAreaContent.split("\\%")).length==2) { + result=Double.parseDouble(operationalNumber[0])%Double.parseDouble(operationalNumber[1]); + textArea.setText(result+""); + + } + + + } + //如果运算符的数目超过一个,则给出警告 + else { + JOptionPane.showMessageDialog( textArea, "水平有限现在还不能进行连续的加减乘除噢~","警告", + JOptionPane.WARNING_MESSAGE, null); + textArea.setText(""); + } + + } + //***************+,-,×,÷,%(取余)的计算到此结束********************* + + + /* + * 以下为计算计算器中"√","x^2","1/x","CE","C","del","±" + * 等的符号,及当用户输入不合法字符时给出警告 + * + * 其中计算"√","x^2","1/x","±","2^x","e^x","x^3"时可能会出现同样的三种情况: + * ①没有输入任何数字时用户就开始就开始运算 + * ②输入的字符中有非数字字符(+-除外)用户仍计算 + * ③输入正常数字时用户运 算 + * 这时只有第③中情况才能进行正常运算,其他两种情况则会给出警告 + * + * 而"ln","lg",用户输入除了以上的三种情况可能还会出现 ④用户输入负数的可能 + * + */ + else if(clickString.equals("C")) { + textArea.setText(""); + } + + //当按下的字符是“√”并且没有其他错误输入时,将原来的String类型的字符转换成Double类型,并在文本域中输出要计算的数字的开根号之后的数字 + else if(clickString.equals("√")){ + + + + if(textAreaContent.isEmpty()){ + JOptionPane.showMessageDialog( textArea, "您还没有输入任何数字噢~","警告", + JOptionPane.WARNING_MESSAGE, null); + } + else if(textAreaContent.contains("×")||textAreaContent.contains("÷")||textAreaContent.contains("%")) { + JOptionPane.showMessageDialog( textArea, "您输入的不是纯数字,其中包含了运算符噢~","警告", + JOptionPane.WARNING_MESSAGE, null); + textArea.setText(""); + } + + else { + result=Double.parseDouble(textArea.getText()); + if(result>=0) { + result=Math.sqrt(result); + textArea.setText(result+" "); + } + //被开方数不能为0 + else { + JOptionPane.showMessageDialog( textArea, "不能为负数开方噢~","警告", + JOptionPane.WARNING_MESSAGE, null); + textArea.setText(""); + + } + } + } + + //当按下的字符是“x^2”并且没有其他错误输入时,将原来的String类型的字符转换成Double类型,并在文本域中输出要计算的数字的平方 + else if(clickString.equals("x^2")){ + + if(textAreaContent.isEmpty()){ + JOptionPane.showMessageDialog( textArea, "您还没有输入任何数字噢~","警告", + JOptionPane.WARNING_MESSAGE, null); + } + else if(textAreaContent.contains("×")||textAreaContent.contains("÷")||textAreaContent.contains("%")) { + JOptionPane.showMessageDialog( textArea, "您输入的不是纯数字,其中包含了运算符噢~","警告", + JOptionPane.WARNING_MESSAGE, null); + textArea.setText(""); + } + else { + result=Double.parseDouble(textArea.getText()); + result*=result; + textArea.setText(result+" "); + } + } + //当按下的字符是“x^3”并且没有其他错误输入时,将原来的String类型的字符转换成Double类型,并在文本域中输出要计算的数字的平方 + else if(clickString.equals("x^3")){ + if(textAreaContent.isEmpty()){ + JOptionPane.showMessageDialog( textArea, "您还没有输入任何数字噢~","警告", + JOptionPane.WARNING_MESSAGE, null); + } + else if(textAreaContent.contains("×")||textAreaContent.contains("÷")||textAreaContent.contains("%")) { + JOptionPane.showMessageDialog( textArea, "您输入的不是纯数字,其中包含了运算符噢~","警告", + JOptionPane.WARNING_MESSAGE, null); + textArea.setText(""); + } + else { + result=Double.parseDouble(textArea.getText()); + result=result*result*result; + textArea.setText(result+" "); + } + } + //当按下的字符是“1/x”并且没有其他错误输入时,将原来的String类型的字符转换成Double类型,并在文本域中输出要计算的数字的倒数(分母不为零) + else if(clickString.equals("1/x")){ + if(textAreaContent.isEmpty()){ + JOptionPane.showMessageDialog( textArea, "您还没有输入任何数字噢~","警告", + JOptionPane.WARNING_MESSAGE, null); + } + + else if(textAreaContent.contains("×")||textAreaContent.contains("÷")||textAreaContent.contains("%")) { + JOptionPane.showMessageDialog( textArea, "您输入的不是纯数字,其中包含了运算符噢~","警告", + JOptionPane.WARNING_MESSAGE, null); + textArea.setText(""); + } + else { + result=Double.parseDouble(textArea.getText()); + if(result!=0){ + result=1/result; + textArea.setText(result+" "); + } + //分母不能为0 + else { + JOptionPane.showMessageDialog( null, "0没有倒数噢~","警告", + JOptionPane.WARNING_MESSAGE, null); + textArea.setText(""); + } + } + } + + //当按下的字符是“±”并且没有其他错误输入时,将原来的String类型的字符转换成Double类型,并在文本域中输出要计算的数字的相反数 + else if(clickString.equals("±")){ + if(textAreaContent.isEmpty()){ + JOptionPane.showMessageDialog( textArea, "您还没有输入任何数字噢~","警告", + JOptionPane.WARNING_MESSAGE, null); + } + + else if(textAreaContent.contains("×")||textAreaContent.contains("÷")||textAreaContent.contains("%")) { + JOptionPane.showMessageDialog( textArea, "您输入的不是纯数字,其中包含了运算符噢~","警告", + JOptionPane.WARNING_MESSAGE, null); + textArea.setText(""); + } + else { + result=Double.parseDouble(textArea.getText()); + result=-result; + textArea.setText(result+" "); + } + } + + //当按下的字符是“e^x”并且没有其他错误输入时,将原来的String类型的字符转换成Double类型,并在文本域中输出要e的result次方 + else if(clickString.equals("e^x")){ + if(textAreaContent.isEmpty()){ + JOptionPane.showMessageDialog( textArea, "请先输入数字再按下e^x键噢~","警告", + JOptionPane.WARNING_MESSAGE, null); + } + else if(textAreaContent.contains("×")||textAreaContent.contains("÷")||textAreaContent.contains("%")) { + JOptionPane.showMessageDialog( textArea, "您输入的不是纯数字,其中包含了运算符噢~","警告", + JOptionPane.WARNING_MESSAGE, null); + textArea.setText(""); + } + else { + result=Double.parseDouble(textArea.getText()); + result=Math.exp(result); + textArea.setText(result+" "); + } + } + //当按下的字符是“2^x”并且没有其他错误输入时,将原来的String类型的字符转换成Double类型,并在文本域中输出要2的result次方 + else if(clickString.equals("2^x")){ + if(textAreaContent.isEmpty()){ + JOptionPane.showMessageDialog( textArea, "请先输入数字再按下2^x键噢~","警告", + JOptionPane.WARNING_MESSAGE, null); + } + else if(textAreaContent.contains("×")||textAreaContent.contains("÷")||textAreaContent.contains("%")) { + JOptionPane.showMessageDialog( textArea, "您输入的不是纯数字,其中包含了运算符噢~","警告", + JOptionPane.WARNING_MESSAGE, null); + textArea.setText(""); + } + else { + result=Double.parseDouble(textArea.getText()); + result=Math.pow(2, result); + textArea.setText(result+" "); + } + } + //当按下的字符是“lg”并且没有其他错误输入时,将原来的String类型的字符转换成Double类型,并在文本域中输出以10为底的result为真数的对数(result的数值大于零) + else if(clickString.equals("lg")){ + if(textAreaContent.isEmpty()){ + JOptionPane.showMessageDialog( textArea, "请先输入数字再按下lg键噢~","警告", + JOptionPane.WARNING_MESSAGE, null); + } + else if(textAreaContent.contains("×")||textAreaContent.contains("÷")||textAreaContent.contains("%")) { + JOptionPane.showMessageDialog( textArea, "您输入的不是纯数字,其中包含了运算符噢~","警告", + JOptionPane.WARNING_MESSAGE, null); + textArea.setText(""); + } + else if(Double.parseDouble(textArea.getText())<=0) {//如果输入的数值小于等于零(即真数小于等于零)时给出警告 + JOptionPane.showMessageDialog( textArea, "真数不能小于等于0噢~","警告", + JOptionPane.WARNING_MESSAGE, null); + textArea.setText(""); + } + else { + result=Double.parseDouble(textArea.getText()); + result=Math.log10(result); + textArea.setText(result+""); + } + } + + //当按下的字符是“lg”并且没有其他错误输入时,将原来的String类型的字符转换成Double类型,并在文本域中输出以e为底的result为真数的对数(result的数值大于零) + else if(clickString.equals("ln")){ + if(textAreaContent.isEmpty()){ + JOptionPane.showMessageDialog( textArea, "请先输入数字再按下ln键噢~","警告", + JOptionPane.WARNING_MESSAGE, null); + } + else if(textAreaContent.contains("×")||textAreaContent.contains("÷")||textAreaContent.contains("%")) { + JOptionPane.showMessageDialog( textArea, "您输入的不是纯数字,其中包含了运算符噢~","警告", + JOptionPane.WARNING_MESSAGE, null); + textArea.setText(""); + } + else if(Double.parseDouble(textArea.getText())<=0) {//如果输入的数值小于等于零(即真数小于等于零)时给出警告 + JOptionPane.showMessageDialog( textArea, "真数不能小于等于0噢~","警告", + JOptionPane.WARNING_MESSAGE, null); + textArea.setText(""); + } + else { + result=Double.parseDouble(textArea.getText()); + result=Math.log10(result)/Math.log10(Math.E); + textArea.setText(result+""); + } + } + //当按下的字符是“del”并且文本域内容不为空时,每按下一次就减少一个字符 + else if(clickString.equals("del")){ + if(textAreaContent.length()!=0) { + textArea.setText(textArea.getText().substring(0,textArea.getText().length()-1)); + } + else { + JOptionPane.showMessageDialog( null, "已经没有可以删除的东西了噢~","警告", + JOptionPane.WARNING_MESSAGE, null); } + } + + else { + textArea.setText(textAreaContent+clickString); + } + } + + //*********************计算"√","x^2","1/x","CE","C","del","±"等的符号到此结束*************************** + + }); + panelWangge.add(standardButton[i]);//把按钮添加到面板上 + } + + add(panelWangge,BorderLayout.CENTER); //把面板添加到窗口的中间 + + } +} + + \ No newline at end of file diff --git a/src/java2020spring/Test.java b/src/java2020spring/Test.java deleted file mode 100644 index fc09c195f566d0e707f5e8a2f05fd168069c73a7..0000000000000000000000000000000000000000 --- a/src/java2020spring/Test.java +++ /dev/null @@ -1,10 +0,0 @@ -package java2020spring; - -public class Test { - - public static void main(String[] args) { - System.out.println("Hello world!"); - - } - -}