前言
這是博主學習完Swing后,使用Swing實現的一個簡單計算器。做簡單的計算器的目的是將最近所學的Swing給應用起來,寫博文介紹的目的是記錄做這個計算器的思路。下面將分為界面和事件兩部分介紹。計算器的詳細代碼將在文末附上鏈接。
計算器的界面


菜單
使用到的控件類主要有JMenuBar
JMenu
JMenuItem
JRadioButtonMenuItem
ButtonGroup
。JMenuBar指的就是一個菜單條里面要裝JMenu也就是上圖的編輯、查看、幫助菜單。但是我們最終操作的單元還不是菜單,而是菜單項,也就是編輯下面的復制、粘貼等。菜單項有像復制粘貼這樣的普通菜單項,也有單選菜單項下拉菜單列表等。使用ButtonGroup的目的是為了使查看下面的單選菜單項每次只能選擇一個。下圖是計算器中的菜單內容:



顯示框和輸入框
界面的整體布局是使用BorderLayout
,顯示框和輸入框使用的組件是JTextField
,是放置在NORTH方位,前面博文介紹過布局得知BorderLayout布局有東南西北中五個方位但是每個方位只能放置一個組件。所以使用JPanel
容器將兩個組件裝在一起,然后將JPanel容器放在界面的北部。
按鈕區
按鈕區使用的組件是JButton
,使用了GridBagLayout
布局。GridBagLayout是一種靈活的網格布局方式,使用GridBagConstraints
可以指定每個組件的所占網格的大小以及容器擴大時組件變化大小等。
//設置按鈕區的布局
private void setButtonsLayout() {
GridBagLayout gbLayout = new GridBagLayout();
buttons.setLayout(gbLayout);
GridBagConstraints gbCons = new GridBagConstraints();
gbCons.fill = GridBagConstraints.BOTH;
gbCons.insets = new Insets(5, 5, 5, 5);
gbCons.weightx = 4; //組件縱向比例為3:4
gbCons.weighty = 3;
JButton jbt = null;
jbt = new JButton("Backspace");
gbCons.gridx = 1;
gbCons.gridy = 0;
gbCons.gridwidth = 2; //橫向占兩格
buttons.add(jbt,gbCons);
jbt = new JButton("CE");
gbCons.gridx = 3;
gbCons.gridy = 0;
gbCons.gridwidth = 2; //橫向占兩格
buttons.add(jbt, gbCons);
jbt = new JButton("C");
gbCons.gridx = 5;
gbCons.gridy = 0;
gbCons.gridwidth = 1;
buttons.add(jbt, gbCons);
String[] butsStr = {"MC","7","8","9","/","MR","4","5","6","*","MS","1","2","3","-","M+","0","+/-",".","+"};
int k=0;
for(int i=1;i<5;i++) {
for(int j=0;j<5;j++) {
gbCons.gridx = j;
gbCons.gridy = i;
buttons.add(new JButton(butsStr[k]), gbCons);
k++;
}
}
jbt = new JButton("sqrt");
gbCons.gridx = 5;
gbCons.gridy = 1;
buttons.add(jbt, gbCons);
jbt = new JButton("1/x");
gbCons.gridx = 5;
gbCons.gridy = 2;
buttons.add(jbt, gbCons);
jbt = new JButton("=");
gbCons.gridheight = 2;
gbCons.gridx = 5;
gbCons.gridy = 3;
buttons.add(jbt, gbCons);
}
結果顯示列表
結果顯示列表使用的組件類為JList
和DefaultListModel
。JList是列表容器,使用DefaultListModel想列表容器中添加列表項。
計算器的事件
計算器的事件主要為按鈕區按鈕的點擊事件(點擊數字按鈕運算按鈕后結果計算)以及結果顯示列表的選擇事件和一個右擊彈出菜單的鼠標右擊事件。

小結
整個計算器的運算規則是仿造win10系統自帶的計算器實現的,其中sqrt運算沒有實現,以及+/-符號替換沒有實現,有待補充,其余基本的還是已經實現。事件的處理機制,在AWT/Swing——事件處理中已經介紹過,這里我就不再重復說啦。關於界面和事件是如何設置的代碼沒有詳細分析,下面會貼上源碼網址,詳細的解釋都在代碼注釋中。