您好,登錄后才能下訂單哦!
之前作者寫過一篇文章,也是關于計算器的,用的是C++與Qt,鏈接在這里
這次用java的swing寫的(這差距好像有點大,好吧是qt太強了).
先上圖:
cdn.xitu.io/2019/12/10/16eebf9aedf7a630">
總體布局使用流布局.
文本框就一個JPanel里面加一個JTextField.
boxField.setLayout(new FlowLayout());
box.setPreferredSize(new Dimension(300, 25));
boxField.add(box);
JTextField設置尺寸需要使用setPreferredSize()而不是setSize().
按鍵4*4網格布局,逐個添加button即可.
buttonsField.setLayout(new GridLayout(4, 4, 20, 20));
buttonsField.setPreferredSize(new Dimension(300, 300));
buttonsField.add(xxx);
//add....
鼠標事件針對button,仔細想一想,單擊一個button,然后文本框里面就會有相應的反應,據此添加事件監聽.
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結果.
github
碼云
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。