diff --git a/src/java2022spring/ShowLayout.java b/src/java2022spring/ShowLayout.java new file mode 100644 index 0000000000000000000000000000000000000000..c9984d0e4943fcb39479809fcd1fc149e6a801b0 --- /dev/null +++ b/src/java2022spring/ShowLayout.java @@ -0,0 +1,13 @@ +package java2022spring; +import java.awt.*; +import javax.swing.*; +public class ShowLayout extends JFrame { + GridLayout Grid;//设置一个网格布局面板 + JTabbedPane p;//设置一个选项卡窗格 + ShowLayout(){ + Grid = new GridLayout(); + p = new JTabbedPane(); + + } + +} diff --git a/src/java2022spring/WaiXing.java b/src/java2022spring/WaiXing.java new file mode 100644 index 0000000000000000000000000000000000000000..7848b765b2e939709f82815419df3aa7319dff75 --- /dev/null +++ b/src/java2022spring/WaiXing.java @@ -0,0 +1,20 @@ +package java2022spring; +import javax.swing.*; +import java.awt.*; + +public class WaiXing { + public static void main(String args[]) { + JFrame window = new JFrame();//创建窗口上面的标题 + window.setTitle("一个计算器"); + Container con = window.getContentPane(); + con.setBackground(Color.pink);//设置窗口背景色 + window.setBounds(100,100,500,500);//设置他的位置和大小 + window.setVisible(true);//设置他可以看到 + window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//点击时关闭 + addButton a = new addButton(); + a.Add(); + window.add(a,BorderLayout.CENTER); + window.validate(); //刷新 新添加的组件 很重要!!之前因为没有这行代码所以总是搞不了 + window.repaint(); + } +} \ No newline at end of file diff --git a/src/java2022spring/addButton.java b/src/java2022spring/addButton.java new file mode 100644 index 0000000000000000000000000000000000000000..2c3aec868903e08e840b663da2baf8268112d1f9 --- /dev/null +++ b/src/java2022spring/addButton.java @@ -0,0 +1,305 @@ +package java2022spring; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; + +//添加那些键进去并且给他们附上各种功能 +public class addButton extends JPanel implements ActionListener{ + JPanel panelone; + JTextField textfield; + String result;//结果 + + ActionListener Number = new NumberAction();//给数字创建一个监听器 + ActionListener other = new otherAction();//给其他功能键创建一个监听器 + + + String ysf1=null;//运算符 + String number=null;//数字 + + boolean point=false;//小数点 + boolean ysf2=false;//也是运算符 + + + public void addButton(String s,ActionListener listener) { + JButton button = new JButton(s);//声明一个按键上面文字是s + panelone.add(button); + button.addActionListener(this); + } + + + public void Add() { + setLayout(new BorderLayout());//窗体布局时BorderLayout布局 + textfield = new JTextField(); + textfield.setText(""+result);//这个窗口显示运算结果 + add(textfield,BorderLayout.NORTH);//这个结果在上方显示 + + panelone = new JPanel();//设置里面的布局 + add(panelone,BorderLayout.CENTER);//它是位于正中央的 + panelone.setLayout(new GridLayout(7,4));//中间设置一个7x5的网格布局 + + + //向里面添加各种键并为它设置一个监听器 数字键设置number,功能键设置other + addButton(" ",other); + addButton("sin",other); + addButton("cos",other); + addButton("tan",other); + addButton("Π",other); + + addButton("lg",other); + addButton(" ",other); + addButton("e",other); + addButton(" ",other); + addButton("x^y",other); + + addButton("开始",other);//摁了“开始”才能使用 + addButton("C",other); + addButton("delete",other); + addButton("/",other); + addButton("X^2",other); + + addButton("7",Number); + addButton("8",Number); + addButton("9",Number); + addButton("X",other); + addButton("√x",other);//这个比较像根号 + + addButton("4",Number); + addButton("5",Number); + addButton("6",Number); + addButton("-",other); + addButton("|x|",other); + + addButton("1",Number); + addButton("2",Number); + addButton("3",Number); + addButton("+",other); + addButton("1/x",other); + + addButton("+/-",other); + addButton("0",Number); + addButton(".",other); + addButton("=",other); + addButton("n!",other); + setVisible(true); + //这是我原本的美好设想 两种不同功能的组件有两个监听器 然后再在各自的监听器类里面写方法 + //但是失败了无数次…… + + } + + + @Override + public void actionPerformed(ActionEvent event) { + + + String str1=event.getActionCommand();//判断按下了哪个键 + String str2=textfield.getText();//获取文本框里面的文本 + String result;//记录结果 + + + if(str1=="0"||str1=="1"||str1=="2"||str1=="3"||str1=="4"||str1=="5"//判断输入的是不是数字 + ||str1=="6"||str1=="7"||str1=="8"||str1=="9") { + if(ysf2==true) {//输入另一个数 + textfield.setText(str1); + ysf2=false;//这个时候没有运算符 + point=false;//也没有小数点 + } + else { + if(str2.equals("0")) { + textfield.setText(str1);} + else { + textfield.setText(str2+str1);} + } + } + else if(str1=="sin"||str1=="cos"||str1=="tan"||str1=="Π"||str1=="lg"//判断输入的是不是那些不需要两个数字的运算符号 + ||str1=="e"||str1=="开始"||str1=="C"||str1=="delete" + ||str1=="x^2"||str1=="√x"||str1=="1/x"||str1=="10^x"||str1=="+/-" + ||str1=="."||str1=="|x|"||str1=="n!") { + str2=jisuan1(str1,str2); //str2去调用jisuan1方法 + textfield.setText(str2);//运算完结果显示到文本框里 + } + if(str1=="+"||str1=="-"||str1=="X"||str1=="/"||str1=="x^y") {//这些都是要两个数字才能运算的 + if(ysf1==null) {//如果没有按运算符 + ysf1=str1;//把str1按了的运算符赋过去给ysf做运算 + number=str2; + ysf2=true;//现在有运算符了 + } + else{ + str2=jisuan2(str2);//str2调用jisuan2方法 + textfield.setText(str2);//运算完结果也是显示到文本框里 + point=true; + ysf2=true; + } + } + else if(str1=="=") {//当摁等号的时候 + str2=jisuan2(str2);//只有jisuan2需要摁等号(jisuan1直接摁完运算符就出结果了 + textfield.setText(str2);//把运算结果显示在文本框里 + } + + + } + + + public String jisuan1(String str1,String str2) {//一个数字和运算符搭配 + boolean point = false; + if(str1=="+/-") {//添加个正负号 + //result=-str2;//这样子不可以,不能直接给String型加负号,所以要稍微左右横跳一小会儿…… + result=String.valueOf(-Double.parseDouble(str2));//用Double.parseDouble()把里面的变成double型 + //再用String.valueOf()把里面转换成String型 + point=true; + } + else if(str1==".") {//是个小数点 + if(point==false) { + result=str2+str1; + point=true;//有时算完后要把其改为true + } + } + else if(str1=="x^2") {//计算x的平方 + result=String.valueOf(Math.pow(Double.parseDouble(str2), 2)); + point=true; + } + else if(str1=="√x") {//开个x的根号 + if(Double.parseDouble(str2)<0) { + result="被开根号的数字不能为负数欸"; + ysf2=true; + } + else { + result=String.valueOf(Math.sqrt(Double.parseDouble(str2))); + point=true; + } + } + else if(str1=="1/x") {//x分之一 + if(Double.parseDouble(str2)==0) { + result="除数不能为零欸"; + ysf2=true; + } + else { + result=String.valueOf(1/Double.parseDouble(str2)); + point=true; + } + } + else if(str1=="sin") {//正弦 + result=String.valueOf(Math.sin(Double.parseDouble(str2)));//Math要用double型做运算所以下面都要反复横跳 + //先把string变成double再把double变回string + point=true; + } + else if(str1=="cos") {//余弦 + result=String.valueOf(Math.cos(Double.parseDouble(str2))); + point=true; + } + else if(str1=="tan") {//正切 + result=String.valueOf(Math.tan(Double.parseDouble(str2))); + point=true; + } + else if(str1=="lg") {//对数运算 + result=String.valueOf(Math.log10(Double.parseDouble(str2))); + point=true; + } + else if(str1=="e") {//e值 + result=String.valueOf(Math.E); + point=true; + } + else if(str1=="Π") {//就是圆周率Π + result=String.valueOf(Math.PI); + point=true; + } + else if(str1=="|x|") {//求绝对值 + result=String.valueOf(Math.abs(Double.parseDouble(str2))); + point=true; + } + else if(str1=="n!") {//求n的阶乘 + int n=1; + if(Double.parseDouble(str2)<0) {//注意0的阶乘也是1! + result="阶乘必须要正整数!!!"; + ysf2=true; + } + else if(str1=="delete") {//删除 + if(str2.length()!=1){ + result=str2.substring(0, str2.length()-1);//用截取比原本字符串短一个数字的方法来完成删除一个个数字的操作 + } + else if(str2.length()==1) {//只剩下一个数字的时候无法截取就直接输出0了 + result="0"; + } + } + else { + for(int i=1;i<=Double.parseDouble(str2);i++) { + n=n*i; + } + result=String.valueOf(n); + } + point=false; + } + if(str1=="开始") {//删掉一开始的null显示 然后再开始使用 + result="0"; + point=false; + number=null; + ysf1=null;//一定要全清一次不然删不干净 + } + + + if(str1=="C") {//一键清空(好像……和CE是一样的? + result="0"; + point=false; + number=null; + ysf1=null;//一定要全清一次不然删不干净 + } + + return result; +} + + + + public String jisuan2(String str2) {//要用两个数的运算 + double jieguo;//整个变量存结果(真的不知道能整啥单词了拼音多方便国人 + if(ysf1=="+") {//加法运算 + jieguo=Double.parseDouble(number)+Double.parseDouble(str2);//继续反复横跳 + result=String.valueOf(jieguo); //变成double运算完之后再变回string + } + else if(ysf1=="-") {//减法运算 + jieguo=Double.parseDouble(number)-Double.parseDouble(str2); + result=String.valueOf(jieguo); + } + else if(ysf1=="X") {//乘法运算 + jieguo=Double.parseDouble(number)*Double.parseDouble(str2); + result=String.valueOf(jieguo); + } + else if(ysf1=="/") {//除法运算 + double b=Double.parseDouble(str2); + if(Double.parseDouble(str2)==0) {//➗右边的数不可以是0 + result="除数不可以为0噢"; + } + else { + jieguo=Double.parseDouble(number)/b; + result=String.valueOf(jieguo);} + } + else if(ysf1=="x^y") {//x的y次方运算 + jieguo=Math.pow(Double.parseDouble(number), Double.parseDouble(str2)); + result=String.valueOf(jieguo); + } + + return result;//返回运算结果 + } + + + + + + +//所以剩下两个类就这样放在这里防止前面添加键的代码变红 + class NumberAction implements ActionListener { + @Override + public void actionPerformed(ActionEvent e) { + } + } + + + class otherAction implements ActionListener{ + @Override + public void actionPerformed(ActionEvent e) { + } + + } + } + + +