這個是真的簡單的計算器,看到網上很多,現學了一些swing,時間緊,自己又菜,這個計算器,有很多限制,只能計算一些特別簡單的計算,比如(2+3+4)是不行的,只能2+3,在網上我也看了很多計算器,但是找到帶三角函數的,冪運算,基本上代碼實現的比較複雜,我覺得既然都很難去理解,覺得沒必要去複製粘貼。我的這個嘞,裏面也有拋出異常(一個是除數爲0還有一個是開放爲負數),這個開方爲負數,當時讀取的時候回把這個負號當成減號,然後輸入sqrt-5會報錯(正常情況應該是輸出NaN,然後控制檯拋出異常),所以我就全換成elseif (原來全是if),把判斷減法的那個條件放在了開方條件的後面,這樣就可以了。
這個計算器的輸入格式:2+3
sin90
2^3
/*
*@小姚
*寫的不好,很多bug,很多限制,才學的,所以不懂,加了特別多的註釋
*/
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.*;
public class Calculator extends JFrame {
private final String[] FH = { "+", "-", "*", "/", ".", "=", "C", "sin", "cos", "tan", "^", "log","sqrt","<-" };
CharSequence FHH[] = { "+", "-", "*", "/" };
private JPanel btjp = new JPanel();// 創建面板容器
private JTextField jt = new JTextField();// 創建文本框
public Calculator(String title) {
super(title);
btjp.setLayout(new GridLayout(6, 4, 20, 5));// 定義面板,並設置爲網格佈局,5行4列,組件水平距離爲20,垂直距離爲5
JButton[] JBtn_1 = new JButton[10];
JButton[] JBtn_2 = new JButton[FH.length];
for (int i = 0; i <= 9; i++)
JBtn_1[i] = new JButton(String.valueOf(i));// 數字按鍵
for (int i = 0; i <= 9; i++) {
JBtn_1[i].setFont(new Font("宋體", Font.BOLD, 30));// 給數字按鍵調整字體大小
}
for (int i = 0; i < FH.length; i++)
JBtn_2[i] = new JButton(String.valueOf(FH[i]));// 符號按鍵
for (int i = 0; i < FH.length; i++) {
//System.out.println(FH[i]);
JBtn_2[i].setFont(new Font("宋體", Font.BOLD, 30));// 給符號按鍵調整字體大小
}
// 把這些按鈕按照事先排好的順序,按在面板容器
btjp.add(JBtn_1[1]);
btjp.add(JBtn_1[2]);
btjp.add(JBtn_1[3]);
btjp.add(JBtn_2[0]);
btjp.add(JBtn_1[4]);
btjp.add(JBtn_1[5]);
btjp.add(JBtn_1[6]);
btjp.add(JBtn_2[1]);
btjp.add(JBtn_1[7]);
btjp.add(JBtn_1[8]);
btjp.add(JBtn_1[9]);
btjp.add(JBtn_2[2]);
btjp.add(JBtn_2[4]);
btjp.add(JBtn_1[0]);
btjp.add(JBtn_2[6]);
btjp.add(JBtn_2[3]);
for (int i = 5; i < FH.length; i++)
btjp.add(JBtn_2[i]);
// btjp.add(JBtn_2[5]);
// btjp.add(JBtn_2[6]);
// btjp.add(JBtn_2[7]);
// btjp.add(JBtn_2[8]);
// btjp.add(JBtn_3[0]);
jt.setHorizontalAlignment(JTextField.RIGHT);// 文本框內容右側對齊
jt.setFont(new Font("宋體", Font.BOLD, 30));
// JBtn_1[2].setFont(new Font("宋體",Font.BOLD,30));
jt.setPreferredSize(new Dimension(200, 100));// 文本框爲寬200,長100
// 以下this是指主窗口JFrame
this.add(jt, BorderLayout.NORTH);// 將文本框放在靠北的地方
this.add(btjp, BorderLayout.CENTER);// 將面板容器放在中央
this.setSize(600, 600);// 設置主窗口的大小
this.setResizable(true);// 表示生成的窗體能夠是否有用戶改變大小,false表示不能,true代表能
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 使用 System exit 方法退出應用程序。
this.setVisible(true);
// etVisible(true)並不是告訴JVM讓該控件可見,而是在內部調用repaint方法把各個控件畫出來進行顯示。
// 如果在控件還沒完全添加完其他控件就setVisible(true)那麼在方法後面添加的控件都不能顯示
for (int i = 0; i <= 9; i++)
JBtn_1[i].addActionListener(new number());// 爲事件源增加監聽器
for (int i = 0; i < FH.length; i++)
JBtn_2[i].addActionListener(new number());
}
private class number extends WindowAdapter implements ActionListener {// 重寫監聽器裏面的內容
public void actionPerformed(ActionEvent e) {// 這個是ActionListener這個接口裏面的方法,監聽器裏的方法
// TODO Auto-generated method stub
// getActionCommand()依賴於按鈕上的字符串
// getSource得到的組件的名稱,而getActionCommand得到的是標籤。
// 如:Button bt=new Button("buttons");
// 用getSource得到的是bt 而用getActionCommand得到的是:buttons
if (!e.getActionCommand().equals("=") && !e.getActionCommand().equals("C")&&!e.getActionCommand().equals("<-")) {
jt.setText(jt.getText() + e.getActionCommand());// 在文本框中顯示
} //
else if(e.getActionCommand().equals("<-")) {
String Formula = jt.getText();
int len = Formula.length();
if(len!=0) {
String s = String.valueOf(Formula.substring(0,len-1));
jt.setText(s);
}
}
else if (e.getActionCommand().equals("=")) {
String Formula = jt.getText();
if (Formula.contains(FHH[0])) {// java中contains方法是判斷是否存在包含關係的,
// 1.java中String元素下標從0開始,substring(a)是從第a個字符開始截取,包含第a個字符。可以看成數學中的[ ),表示左閉右開區間
// 2.substring(a, b)表示截取下標從a開始到b結束的字符,包含第a個字符但是不包含第b個字符,可以看成[a,b)。
// Double.parseDouble方法是把數字類型的字符串,轉換成double類型
// Double.valueOf方法是把數字類型的字符串,轉換成Double類型
double number_1 = Double.parseDouble(Formula.substring(0, Formula.indexOf('+')));
double number_2 = Double.parseDouble(Formula.substring(Formula.indexOf('+') + 1));
jt.setText(String.valueOf(number_1 + number_2));
}
else if (Formula.contains(FHH[2])) {
double number_1 = Double.parseDouble(Formula.substring(0, Formula.indexOf('*')));
double number_2 = Double.parseDouble(Formula.substring(Formula.indexOf('*') + 1));
jt.setText(String.valueOf(number_1 * number_2));
}
else if (Formula.contains(FHH[3])) {
double number_1 = Double.parseDouble(Formula.substring(0, Formula.indexOf('/')));
double number_2 = Double.parseDouble(Formula.substring(Formula.indexOf('/') + 1));
try {
check(number_1, number_2);
} catch (YiChangException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
jt.setText(String.valueOf(number_1 / number_2));
}
else if (Formula.contains("sin")) {
double number = Double.parseDouble(Formula.substring(Formula.indexOf('n') + 1));
double a = Math.toRadians(number);
jt.setText(String.valueOf(Math.sin(a)));
}
else if (Formula.contains("cos")) {
double number = Double.parseDouble(Formula.substring(Formula.indexOf('s') + 1));
double a = Math.toRadians(number);
jt.setText(String.valueOf(Math.cos(a)));
}
else if (Formula.contains("tan")) {
double number = Double.parseDouble(Formula.substring(Formula.indexOf('n') + 1));
double a = Math.toRadians(number);
jt.setText(String.valueOf(Math.tan(a)));
}
else if (Formula.contains("^")) {
double number_1 = Double.parseDouble(Formula.substring(0, Formula.indexOf('^')));
double number_2 = Double.parseDouble(Formula.substring(Formula.indexOf('^') + 1));
jt.setText(String.valueOf(Math.pow(number_1, number_2)));
}
else if (Formula.contains("log")) {
double number = Double.parseDouble(Formula.substring(Formula.indexOf('g') + 1));
jt.setText(String.valueOf(Math.log(number)));
}
else if (Formula.contains("sqrt")) {
double number = Double.parseDouble(Formula.substring(Formula.indexOf('t') + 1));
if(number<0)System.out.println("skadh");
try {
check2(number);
} catch (YiChangException2 e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
jt.setText(String.valueOf(Math.sqrt(number)));
}
else if (Formula.contains(FHH[1])) {
double number_1 = Double.parseDouble(Formula.substring(0, Formula.indexOf('-')));
double number_2 = Double.parseDouble(Formula.substring(Formula.indexOf('-') + 1));
jt.setText(String.valueOf(number_1 - number_2));
}
} else {
jt.setText(null);
}
}
}
void check(double x, double y) throws YiChangException {
if (y == 0) {
throw new YiChangException("您輸入的分母爲0,不能進行除法運算");
} else
return;
}
void check2(double x) throws YiChangException2 {
if (x<0) {
throw new YiChangException2("您輸入的數爲負數,不能進行開方運算");
} else
return;
}
public static void main(String[] args) {
new Calculator("炒雞簡單的計算器");
}
}
class YiChangException2 extends Exception {
public YiChangException2() {
}
public YiChangException2(String message) {
super(message);
}
}
class YiChangException extends Exception {
public YiChangException() {
}
public YiChangException(String message) {
super(message);
}
}