package test;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Z extends JFrame implements ActionListener, FocusListener {
private String[] total = { "1", "2", "3", "+", "4", "5", "6", "-", "7", "8", "9", "*", "0", ".", "=", "/" }; // 總數組
private String[] other = { "clear", "delete" }; // 其它功能數組
private String[] symbol = { "+", "-", "*", "/" }; // 符號數組
private String multinumber = "0", operator1 = "", exists = "", operator2 = null, s = "";
// multinumber(多位數) operator1(運算符) exists(存在的)
private double d1, d2 = 0;
private int Count = 0;
JPanel jptotal = new JPanel(); // 總面板
JTextField jtexternal = new JTextField("0"); // 外部文本框
JTextField jtinside = new JTextField(); // 內部文本框
JPanel jptop1 = new JPanel(); // 頂部面板1
JPanel jptop2 = new JPanel(); // 頂部面板2
JPanel jpmiddle = new JPanel(); // 中部面板
public Z() {
jptotal.setLayout(new BorderLayout());
// 使用邊界布局管理器
jptop1.setLayout(new GridLayout(2, 0));
jptop1.add(jtexternal);
jptop2.setLayout(new GridLayout(0, 2));
for (int i = 0; i < other.length; i++) {
JButton jbi = new JButton("" + other[i]);
jbi.setSize(100, 10);
jptop2.add(jbi);
jbi.addActionListener(this);
}
jpmiddle.setLayout(new GridLayout(4, 0));
for (int i = 0; i < total.length; i++) {
JButton jbi = new JButton("" + total[i]);
jpmiddle.add(jbi);
jbi.addActionListener(this);
}
jtexternal.addFocusListener(this);
jtexternal.add(jtinside);
jtinside.addFocusListener(this);
// 上面三行代碼的作用是讓文本框不可被選中
jptop1.add(jptop2);
jptotal.add(jptop1, "North");
// 以jp1為壹個整體,讓jp1裏面的內容從最上面開始填充
jptotal.add(jpmiddle);
add(jptotal);
setVisible(true);
setSize(500, 500);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
// ctrl+/ :註釋
public void actionPerformed(ActionEvent e) throws ArithmeticException {
try {
String inputing = e.getActionCommand();
// 表示獲取當前輸入的內容
if (inputing.equals(".")) {
Count++;
}
exists = jtexternal.getText();
if (operator2 != null) {
int k = 0;
for (int i = 0; i < symbol.length; i++) {
if (operator2.equals(symbol[i])) {
k = k + 1;
}
if (inputing.equals(symbol[i])) {
k = k + 1;
}
if (k == 2) {
jtexternal.setText(exists.substring(0, exists.length() - 1) + inputing);
operator1 = inputing;
return;
}
// 實現四則運算符不可同時存在,新輸入的替換舊的
if (operator2.equals(symbol[i]) && inputing.equals(".")) {
return;
}
// 實現四則運算符和點不可挨著出現(點後面可以出現四則運算符,點前面不可出現)
}
}
if (exists.equals("0")) {
if (inputing.equals(".") || (inputing.equals("+")) || (inputing.equals("-")) || (inputing.equals("*"))
|| (inputing.equals("/"))) {
jtexternal.setText("0" + inputing);
} else {
jtexternal.setText(inputing);
}
} else {
jtexternal.setText(exists + inputing);
}
// 實現如果0前面沒有非0數字的話,那麽無論輸入多少次0,都只顯示壹個0,如果輸入其它數字,0將會被替換
if ((d1 == 0.0 || d2 == 0.0) && inputing.equals("=") && !exists.substring(0, 1).equals("0")) {
return;
}
// 實現如果文本框內存在數字,那麽輸入等號,將打印其本身
if (inputing.equals("clear")) {
multinumber = "0";
exists = "";
operator1 = "";
jtexternal.setText("0");
operator2 = null;
d2 = 0;
s = "";
Count = 0;
d1 = 0.0;
// 實現,當點擊clear時,文本框內將被清空至0,所有數據都將還原至初始狀態
} else if (inputing.equals("delete")) {
if (exists.length() <= 1 || s.equals("=")) {
jtexternal.setText("0");
multinumber = "0";
exists = "";
operator1 = "";
operator2 = null;
d2 = 0;
s = "";
Count = 0;
d1 = 0;
// 實現,按delete刪除剛輸入的內容,如果將最後壹個數字刪除,那麽效果同按clear
} else {
if (inputing.equals("+") || inputing.equals("-") || inputing.equals("*") || inputing.equals("/")) {
Count = 1;
}
jtexternal.setText(exists.substring(0, exists.length() - 1));
// 將operator2存儲上壹次值
operator2 = exists.substring(exists.length() - 2, exists.length() - 1);
/*
* 實現如果四則運算符後面有數字的話
* 那麽如果此時按刪除鍵
* 刪除之後如果新輸入的還是四則運算符話
* 那麽將會將原來的四則運算符替換成新輸入的
*/
}
} else if (!inputing.equals("+") && !inputing.equals("-") && !inputing.equals("*") && !inputing.equals("/")
&& !inputing.equals("=")) {
// 判斷輸入是否為數字
if (s.equals("=")) {
if (exists.equals("除數不能為0") || new Double(exists) == d1) {
if (inputing.equals(".")) {
jtexternal.setText("0" + inputing);
} else {
jtexternal.setText(inputing);
}
}
s = "";
}
// 實現壹次計算完成之後,可以進行新的運算
if (multinumber == null) { // 多位數計算
multinumber = inputing;
} else {
multinumber += inputing;
}
d1 = new Double(multinumber);
if (operator1.equals("+")) { // 進行四則運算
if (d2 == 0) {
if (operator1.equals("*") || operator1.equals("/")) {
d2 = 1;
}
}
// 實現,當四則運算符後面沒有數字時,那麽輸入等號後結果將為符號前面的結果,如果符號前面只有壹個數字,那麽將打印自身
d1 = d1 + d2;
} else if (operator1.equals("-")) {
d1 = d2 - d1;
} else if (operator1.equals("*")) {
d1 = d1 * d2;
} else if (operator1.equals("/")) {
d1 = d2 / d1;
}
// 利用臨時變量f2,實現四則運算
operator2 = inputing;
} else if (!inputing.equals("=")) { // [四則運算符] 輸入等號後繼續進行計算
multinumber = "0";
operator1 = inputing;
d2 = d1;
operator2 = inputing;
s = "";
Count = 0;
// 實現小數運算
} else { // 就是 [=] 得出最終結果
jtexternal.setText("" + d1);
Count = 0;
s = "=";
multinumber = "0";
if (operator2.equals("0") && "/".equals(operator1)) {
operator2 = null;
d1 = 0;// 將非法運算值替換成正確值
throw new ArithmeticException();// 指定拋出異常的條件
//賦值計算不拋算數異常,如果想讓其拋出,必須指定條件重新拋出異常
} else {
operator1 = inputing;
operator2 = null;
d2 = 0;
} // 計算結果
if (inputing.equals("=") && (d1 == 0.0 || d2 == 0.0)) {
return;
}
// 實現等號不可重復輸入
}
} catch (ArithmeticException e1) {
jtexternal.setText("除數不能為0");
// 指定拋出異常內容
}
}
public static void main(String[] args) {
new Z();
}
public void focusGained(FocusEvent e) {
jtinside.requestFocus();
// 讓焦點聚焦到內部文本框,實現外部文本框的不可聚焦功能
}
public void focusLost(FocusEvent e) {
}
}
/*
* 目前delete刪除輸入值之後讓其它值還原功能未實現,等以後再進行改進 舉個例子:比如我要計算1+1,但是在輸入等號的時候,我想換成別的
* 比如我想換成1-1,我按delete將1和加號刪除,換成1-1 但是結果卻不是0 又或者我換成11+1,但是結果卻不是12
* 又或者當我輸入11時,我不小心多輸入了壹個數字,這時候再進行運算,結果就不是我想要的了 ...
*/