1.概述
之前作者寫過一篇文章,也是關於計算器的,用的是C++與Qt,鏈接在這裏
這次用java的swing寫的(這差距好像有點大,好吧是qt太強了).
先上圖:
2.UI
總體佈局使用流佈局.
(1)文本框
文本框就一個JPanel裏面加一個JTextField.
boxField.setLayout(new FlowLayout());
box.setPreferredSize(new Dimension(300, 25));
boxField.add(box);
JTextField設置尺寸需要使用setPreferredSize()而不是setSize().
(2)按鍵
按鍵4*4網格佈局,逐個添加button即可.
buttonsField.setLayout(new GridLayout(4, 4, 20, 20));
buttonsField.setPreferredSize(new Dimension(300, 300));
buttonsField.add(xxx);
//add....
3.鼠標事件
鼠標事件針對button,仔細想一想,單擊一個button,然後文本框裏面就會有相應的反應,據此添加事件監聽.
num0.addActionListener(v -> {
box.setText(box.getText() + "0");
mainFrame.requestFocus();
});
requestFocus()這一行把焦點還給JFrame,因爲鼠標點擊button後,button會獲取焦點,會影響後面的鍵盤監聽.
4.鍵盤事件
鍵盤事件與鼠標事件類似,針對每個鍵判斷即可.
在這裏的是把KeyListener註冊到JFrame上面,直接在裏面重寫以下三個KeyListener的方法:
public void keyPressed(KeyEvent e);
public void keyReleased(KeyEvent e);
public void keyTyped(KeyEvent e);
基本上就是通過
if (e.getKeyCode() == KeyEvent.VK_xxxx)
來判斷各個鍵,唯一要注意一下的是+與*
因爲作者使用的鍵盤沒有小鍵盤(尷尬....),+與*需要shift+=或8,嘗試過直接
if (e.getKeyCode() == KeyEvent.VK_PLUS)
if (e.getKeyCode() == KeyEvent.VK_ADD)
if (e.getKeyCode() == KeyEvent.VK_MUTIPLY)
無效.
因此需要在KeyPressed這裏判斷是否按下了shift,然後到了KeyReleased()的時候,特判一下8與=:
else if (e.getKeyCode() == KeyEvent.VK_8)
box.setText(box.getText() + (shift ? "*" : "8"));
else if(e.getKeyCode() == KeyEvent.VK_EQUALS)
{
if(shift)
box.setText(box.getText() + "+");
else
setResult();
}
5.計算表達式
計算表達式部分這裏講了就不詳細說了,代碼在後面.
簡單來說就是先使用
GetResult.setExpression();
這個靜態方法設置表達式,然後通過
GetResult.valid()
判斷是否合法,合法的話通過
GetResult.result()
獲取String結果.