整體代碼如下:
package kant.learning;
//其實(shí)我不太清楚需要用到哪些包阅虫,因此,都是用到了之后再點(diǎn)擊導(dǎo)入的逻杖;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MyCalculator {
/*基本參數(shù)定義并初始化*/
float ans = 0; //用于存儲(chǔ)答案拜银,初始為0佩微;
String ans_dis = "0"; //用于存儲(chǔ)顯示字段削饵,初始為“0”加叁;
float tmp = 0; //用于存儲(chǔ)輸入扮休,初始為0锣枝;
String act = "+"; //用于存儲(chǔ)符號(hào)厢拭,默認(rèn)為“+”;
int arg_point = 0; //判斷是否在小數(shù)點(diǎn)之后撇叁,默認(rèn)為0供鸠,即不在小數(shù)點(diǎn)后;
static int arg_mtinput1 = 10; //如果不在小數(shù)點(diǎn)后陨闹,多次輸入處理時(shí)使用的常數(shù)楞捂,處理方式為 tmp = tmp * 10 + new_input,這個(gè)參數(shù)其實(shí)不需要趋厉,寫出來方便解釋寨闹,如果必要,可以用來調(diào)整進(jìn)制君账;
float arg_mtinput2 = 1; //如果在小數(shù)點(diǎn)后繁堡,多次輸入處理時(shí)使用的變量,arg = arg / 10乡数,tem = tem + new_input * arg;
/*創(chuàng)建UI組件*/
JFrame calFrame = new JFrame("cal");
JTextField ansField = new JTextField(ans_dis, 20); //用于顯示答案的文本框椭蹄,第一個(gè)參數(shù)是顯示的對(duì)象,第二個(gè)參數(shù)是文本框顯示的列數(shù)(長(zhǎng)度)净赴;
JButton button_0 = new JButton("0"); //參數(shù)為按鈕上顯示的內(nèi)容塑娇;
JButton button_1 = new JButton("1");
JButton button_2 = new JButton("2");
JButton button_3 = new JButton("3");
JButton button_4 = new JButton("4");
JButton button_5 = new JButton("5");
JButton button_6 = new JButton("6");
JButton button_7 = new JButton("7");
JButton button_8 = new JButton("8");
JButton button_9 = new JButton("9");
JButton button_point = new JButton(".");
JButton button_mtp = new JButton("*");
JButton button_div = new JButton("/");
JButton button_add = new JButton("+");
JButton button_sub = new JButton("-");
JButton button_eql = new JButton("=");
JButton button_clear = new JButton("clear");
/*MyCalculator的構(gòu)造器*/
public MyCalculator() {
/*第一步,先把界面做出來*/
//創(chuàng)建容器,將UI組建放上去
JPanel pan = new JPanel();
pan.setLayout(new GridLayout(4,4,5,5)); //GridLayout是一個(gè)矩陣式布局的控件,用處很大槽地,這里創(chuàng)建一個(gè)控件,四個(gè)參數(shù)分別為行數(shù)写妥、列數(shù)、橫向間隔审姓、縱向間隔珍特;
pan.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); //設(shè)置四邊邊距;
pan.add(button_7);
pan.add(button_8);
pan.add(button_9);
pan.add(button_div);
pan.add(button_4);
pan.add(button_5);
pan.add(button_6);
pan.add(button_mtp);
pan.add(button_1);
pan.add(button_2);
pan.add(button_3);
pan.add(button_sub);
pan.add(button_0);
pan.add(button_point);
pan.add(button_eql);
pan.add(button_add);
JPanel pan_up = new JPanel();
pan_up.setLayout(new BorderLayout()); //BorderLayout也是一個(gè)布局管理器魔吐,只有東南西北中五種位置扎筒,默認(rèn)為中間;
pan_up.setBorder(BorderFactory.createEmptyBorder(10,5,5,5));
ansField.setHorizontalAlignment(JTextField.RIGHT);
pan_up.add(ansField, BorderLayout.NORTH);
pan_up.add(button_clear, BorderLayout.SOUTH);
pan_up.add(button_clear, BorderLayout.EAST); //這邊可以看到酬姆,可以重疊使用嗜桌,即同時(shí)靠下并靠右;
//界面設(shè)置
calFrame.setLocation(500, 300); //設(shè)置窗口在屏幕上的位置辞色;
calFrame.setResizable(true); //設(shè)置大小可調(diào)整骨宠;
calFrame.getContentPane().setLayout(new BorderLayout());
calFrame.getContentPane().add(pan_up, BorderLayout.NORTH);
calFrame.getContentPane().add(pan, BorderLayout.CENTER);
calFrame.pack(); //記得整體打包;
calFrame.setVisible(true);
//增加窗口關(guān)閉時(shí)退出程序的動(dòng)作相满,否則不會(huì)自動(dòng)退出
calFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
/*處理計(jì)算邏輯*/
//如果輸入的是數(shù)字
class LisnNum implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
//取得輸入值文本层亿;
String inputTmp = ((JButton) e.getSource()).getText();
//如果之前沒有小數(shù)點(diǎn);
if(arg_point == 0) {
//將輸入的文本轉(zhuǎn)換為數(shù)字立美;
tmp = tmp * arg_mtinput1 + Integer.parseInt(inputTmp);
//調(diào)整顯示器的顯示內(nèi)容匿又;
//因?yàn)橐婚_始有設(shè)定一個(gè)0,就沒法直接在后面接上輸入的數(shù)字建蹄,多了一個(gè)判斷碌更;
if(ans_dis.equals("0"))
ans_dis = inputTmp;
else
ans_dis = ans_dis + inputTmp;
ansField.setText(ans_dis);
}
//如果還在小數(shù)點(diǎn)后的輸入狀態(tài);
else {
arg_mtinput2 = arg_mtinput2 / arg_mtinput1;
tmp = Integer.parseInt(inputTmp) * arg_mtinput2 + tmp;
ans_dis = Float.toString(tmp);
ansField.setText(ans_dis);
}
}
}
//如果輸入的是小數(shù)點(diǎn)
class LisnPoint implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
arg_point = 1;
ans_dis = ans_dis + ".";
ansField.setText(ans_dis);
}
}
//如果輸入的是符號(hào)
class LisnSign implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
//計(jì)算上一步的答案躲撰;
if(act.equals("+"))
ans = ans + tmp;
if(act.equals("-"))
ans = ans - tmp;
if(act.equals("*"))
ans = ans * tmp;
if(act.equals("/"))
ans = ans / tmp;
//輸入暫存復(fù)位為0针贬;
tmp = 0;
//小數(shù)點(diǎn)復(fù)位為0,即之后的輸入沒有小數(shù)點(diǎn)拢蛋;
arg_point = 0;
arg_mtinput2 = 1;
//下一步計(jì)算的符號(hào)為當(dāng)前輸入的符號(hào)桦他;
act = ((JButton) e.getSource()).getText();
ans_dis = Float.toString(ans) + act;
ansField.setText(ans_dis);
}
}
//如果輸入的是等于號(hào)
class LisnEql implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if(act.equals("+"))
ans = ans + tmp;
if(act.equals("-"))
ans = ans - tmp;
if(act.equals("*"))
ans = ans * tmp;
if(act.equals("/"))
ans = ans / tmp;
ans_dis = Float.toString(ans);
ansField.setText(ans_dis);
tmp = 0;
act = "+";
arg_point = 0;
arg_mtinput2 = 1;
}
}
//如果輸入的是clear
class LisnClear implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
//各參數(shù)復(fù)位;
ans = 0;
ans_dis = "0";
tmp = 0;
act = "+";
arg_point = 0;
arg_mtinput1 = 10;
arg_mtinput2 = 1;
ansField.setText(ans_dis);
}
}
/*構(gòu)建運(yùn)算所需的實(shí)體谆棱,綁定按鈕與運(yùn)算邏輯*/
LisnNum lisnNum = new LisnNum();
LisnPoint lisnPoint = new LisnPoint();
LisnSign lisnSign = new LisnSign();
LisnEql lisnEql = new LisnEql();
LisnClear lisnClear = new LisnClear();
button_0.addActionListener(lisnNum);
button_1.addActionListener(lisnNum);
button_2.addActionListener(lisnNum);
button_3.addActionListener(lisnNum);
button_4.addActionListener(lisnNum);
button_5.addActionListener(lisnNum);
button_6.addActionListener(lisnNum);
button_7.addActionListener(lisnNum);
button_8.addActionListener(lisnNum);
button_9.addActionListener(lisnNum);
button_point.addActionListener(lisnPoint);
button_div.addActionListener(lisnSign);
button_mtp.addActionListener(lisnSign);
button_add.addActionListener(lisnSign);
button_sub.addActionListener(lisnSign);
button_eql.addActionListener(lisnEql);
button_clear.addActionListener(lisnClear);
}
/*主函數(shù)*/
public static void main(String[] args) {
/*構(gòu)建一個(gè)計(jì)算器實(shí)體*/
MyCalculator calculator = new MyCalculator();
}
}