
這學(xué)期 Java 就快結(jié)課了,上機(jī)課最后布置了幾個(gè)題,最后一題要求寫一個(gè)計(jì)算器有點(diǎn)意思,記錄一下。
需求:
設(shè)計(jì)一個(gè)在windows系統(tǒng)中可以使用的“計(jì)算器”窗口并實(shí)現(xiàn)(+、-,×,÷等)其功能。
實(shí)現(xiàn)計(jì)算器,首先要有一個(gè)窗口:
// 創(chuàng)建窗口
final JFrame jf = new JFrame("計(jì)算器");
// 流動(dòng)布局,居中
jf.setLayout(new FlowLayout(1,5,5));
jf.setSize(293,251);
//
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// 不可以改變大小
jf.setResizable(false);
// 創(chuàng)建容器,存放顯示數(shù)字框和 C 按鈕
JPanel panel1 = new JPanel();
// 定義按鈕面板,并設(shè)置為網(wǎng)格布局,4行4列,組件水平、垂直間距均為3
JPanel panel2 = new JPanel(new GridLayout(4,4,1,1));
有了窗口容器,就要往里面添加組件了。計(jì)算器首先要有一個(gè)文本框來顯示數(shù)字,然后還要有數(shù)字按鈕,加減乘除小數(shù)點(diǎn)等號(hào),最后還要一個(gè)刪除按鈕 C 。
然后一一添加即可。
// 創(chuàng)建文本域,放置輸入數(shù)據(jù)和結(jié)果
JTextArea text = new JTextArea(1,13);
// 設(shè)置字體
text.setFont(new Font(null, Font.PLAIN, 20));
// 設(shè)置大小
text.setPreferredSize(new Dimension(190,28));
// 不可編輯
text.setEditable(false);
panel1.add(text);
// 創(chuàng)建一個(gè)清除按鈕'C'
JButton btnC = new JButton("C");
btnC.setFont(new Font(null, Font.PLAIN, 20));
btnC.setPreferredSize(new Dimension(55,28));
panel1.add(btnC);
// 按鈕數(shù)組
String btn_str[] = {"1","2","3","/","4","5","6","*","7","8","9","-","0",".","=","+"};
JButton btn[] = new JButton[btn_str.length];
for(int i = 0 ; i < btn_str.length ; i++ ){
btn[i]=new JButton(btn_str[i]);
btn[i].setFont(new Font(null, Font.PLAIN, 20));
btn[i].setPreferredSize(new Dimension(70,42));
panel2.add(btn[i]);
}
這里通過循環(huán)創(chuàng)建按鈕數(shù)組。省時(shí)又省力,快樂好心情。
到這里面板內(nèi)容就做好了,接下來就需要為每個(gè)按鈕添加功能。
先來看數(shù)字按鈕和運(yùn)算符號(hào)按鈕:
// 按鈕功能
for(int i = 0 ; i < btn_str.length ; i++) {
if(i != 14) {
// 如果不是等于號(hào)
int j = i;
btn[i].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 獲取文本框內(nèi)容
String textStr = text.getText();
// 如果有等號(hào),清空文本框
if(textStr.indexOf("=") != -1) {
text.setText("");
}
// 獲取按鈕字符添加到文本框
String s = btn[j].getText();
text.append(s);
}
});
}else {
// 如果點(diǎn)擊等于號(hào)
btn[i].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
// 獲取文本框內(nèi)容
String gongshi = text.getText();
// 計(jì)算公式
String jieguo = jse.eval(gongshi).toString();
// 如果結(jié)果字符串過長,只顯示等號(hào)和結(jié)果
if(jieguo.length() > 18) {
jieguo = jieguo.substring(jieguo.length()-16, jieguo.length());
text.setText("=");
text.append(jieguo);
}else {
text.append("=");
text.append(jieguo);
}
//如果出錯(cuò)
} catch (Exception t) {
text.setText("");
}
}
});
}
}{ }// 皮皮狗子寫的!
i = 14 的時(shí)候呢,這個(gè)按鈕是 '=' 號(hào),所有要區(qū)別對(duì)待一下。
用戶點(diǎn)擊按鈕的時(shí)候,獲取到按鈕上的字符,然后將該字符添加的文本框內(nèi),當(dāng)用戶點(diǎn)擊等于號(hào)的時(shí)候進(jìn)行計(jì)算。
這里計(jì)算的時(shí)候用到了這個(gè)方法。
String jieguo = jse.eval(gongshi).toString();
通過下面這條語句引入這個(gè)方法。
static ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");
通過這個(gè)方法可以自動(dòng)將字符串類型的公式計(jì)算出結(jié)果,并且可以通過 try-catch 捕捉到錯(cuò)誤。
接下來實(shí)現(xiàn)刪除鍵 C :
// C 鍵 功能
btnC.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String textStr = text.getText();
if(textStr.indexOf("=") != -1) {
text.setText("");
}else {
textStr = textStr.substring(0,(textStr.length() - 1));
text.setText(textStr);
}
}
});
最后將面板添加到窗口:
// 把 面板容器 設(shè)置到 窗口
// panel1 設(shè)置到頂部
jf.getContentPane().add(panel1,BorderLayout.NORTH);
// panel1 設(shè)置到底部
jf.getContentPane().add(panel2,BorderLayout.CENTER);
// 顯示窗口,前面創(chuàng)建的信息都在內(nèi)存中,通過 jf.setVisible(true) 把內(nèi)存中的窗口顯示在屏幕上。
jf.setVisible(true);
OK,一個(gè)簡單的計(jì)算器就完成了!

2018/6/12