以前做者寫過一篇文章,也是關於計算器的,用的是C++與Qt,連接在這裏java
此次用java的swing寫的(這差距好像有點大,好吧是qt太強了).git
先上圖:github
整體佈局使用流佈局.佈局
文本框就一個JPanel裏面加一個JTextField.測試
boxField.setLayout(new FlowLayout()); box.setPreferredSize(new Dimension(300, 25)); boxField.add(box);
JTextField設置尺寸須要使用setPreferredSize()而不是setSize()..net
按鍵4*4網格佈局,逐個添加button便可.code
buttonsField.setLayout(new GridLayout(4, 4, 20, 20)); buttonsField.setPreferredSize(new Dimension(300, 300)); buttonsField.add(xxx); //add....
鼠標事件針對button,仔細想想,單擊一個button,而後文本框裏面就會有相應的反應,據此添加事件監聽.blog
num0.addActionListener(v -> { box.setText(box.getText() + "0"); mainFrame.requestFocus(); });
requestFocus()這一行把焦點還給JFrame,由於鼠標點擊button後,button會獲取焦點,會影響後面的鍵盤監聽.事件
鍵盤事件與鼠標事件相似,針對每一個鍵判斷便可.圖片
在這裏的是把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(); }
計算表達式部分這裏講了就不詳細說了,代碼在後面.
簡單來講就是先使用
GetResult.setExpression();
這個靜態方法設置表達式,而後經過
GetResult.valid()
判斷是否合法,合法的話經過
GetResult.result()
獲取String結果.