不管是AWT還是Swing,都把選擇框分成兩類:覆選框和單選按鈕,這兩類控制項無論是外觀上還是功能上均有顯著差異。例如,在外觀方面,覆選框是在方框內打勾,而單選按鈕是在圓圈內畫圓點;在功能方面,覆選框允許多選,而同組的單選按鈕只能選擇其中一個。然而AWT的覆選框和單選按鈕統統採用Checkbox類型, ...
不管是AWT還是Swing,都把選擇框分成兩類:覆選框和單選按鈕,這兩類控制項無論是外觀上還是功能上均有顯著差異。例如,在外觀方面,覆選框是在方框內打勾,而單選按鈕是在圓圈內畫圓點;在功能方面,覆選框允許多選,而同組的單選按鈕只能選擇其中一個。然而AWT的覆選框和單選按鈕統統採用Checkbox類型,區別之處在於是否加入了單選組CheckboxGroup。這不可避免又帶來困惑,同樣是Checkbox類型,代碼該如何區分某個選擇框到底是覆選框還是單選按鈕?顯然AWT的控制項設計很不合理,非常容易引起混淆,為此Swing乾脆將它倆徹底分開,各自分配對應的控制項類型,從此井水不犯河水,大家才能相安無事。
Swing給覆選框起的名字叫JCheckBox,該控制項與AWT的Checkbox用法相似,但在細節上存在下列差異:
1、對於JCheckBox來說,setLabel方法已經廢棄,改為使用統一的setText方法來設置文本。同時獲取控制項文本的getLabel方法也改成了getText方法。
2、getState方法被直接取消了,JCheckBox改為調用isSelected方法判斷當前覆選框是否選中。同時設置選中狀態的setState方法也改成了setSelected方法。
下麵是利用JCheckBox點菜的代碼例子:
JPanel panelTop = new JPanel(); // 創建頂部面板 JCheckBox ck1 = new JCheckBox("麻婆豆腐"); // 創建一個覆選框 JCheckBox ck3 = new JCheckBox("清蒸桂花魚"); // 創建一個覆選框 JCheckBox ck2 = new JCheckBox("香辣小龍蝦"); // 創建一個覆選框 panelTop.add(ck1); // 在頂部面板上添加覆選框 panelTop.add(ck2); // 在頂部面板上添加覆選框 panelTop.add(ck3); // 在頂部面板上添加覆選框 frame.add(panelTop, BorderLayout.NORTH); // 把頂部面板添加到視窗的北邊(上方) JCheckBox[] boxArray = new JCheckBox[]{ck1, ck2, ck3}; // 構建覆選框數組 ck1.addItemListener(new ItemListener() { // 給覆選框添加一個點擊監聽器 public void itemStateChanged(ItemEvent e) { // 覆選框的狀態發生變化 // getStateChange方法用於獲取覆選框的當前狀態。1為勾選,0為取消勾選 labelCenter.setText(String.format("您%s了%s", (e.getStateChange() == 1 ? "點" : "取消"), ck1.getText())); labelBottom.setText("當前已點菜餚包括:" + getCheckedItem(boxArray)); } }); ck2.addItemListener(new ItemListener() { // 給覆選框添加一個點擊監聽器 public void itemStateChanged(ItemEvent e) { // 覆選框的狀態發生變化 // getStateChange方法用於獲取覆選框的當前狀態。1為勾選,0為取消勾選 labelCenter.setText(String.format("您%s了%s", (e.getStateChange() == 1 ? "點" : "取消"), ck2.getText())); labelBottom.setText("當前已點菜餚包括:" + getCheckedItem(boxArray)); } }); ck3.addItemListener(new ItemListener() { // 給覆選框添加一個點擊監聽器 public void itemStateChanged(ItemEvent e) { // 覆選框的狀態發生變化 // getStateChange方法用於獲取覆選框的當前狀態。1為勾選,0為取消勾選 labelCenter.setText(String.format("您%s了%s", (e.getStateChange() == 1 ? "點" : "取消"), ck3.getText())); labelBottom.setText("當前已點菜餚包括:" + getCheckedItem(boxArray)); } });
以上代碼出現的getCheckedItem方法用來獲取已經選定的菜單,該方法的定義代碼示例如下:
// 獲取已經選定的菜單 private static String getCheckedItem(JCheckBox[] boxArray) { String itemDesc = ""; for (JCheckBox box : boxArray) { // 遍歷覆選框數組 if (box.isSelected() == true) { // 覆選框被選中了 if (itemDesc.length() > 0) { itemDesc = itemDesc + "、"; } itemDesc = itemDesc + box.getText(); // 菜單添加選定的菜餚 } } return itemDesc; }
運行上述的覆選框測試代碼,彈出視窗的初始界面如下圖所示。
從左往右依次勾選三個覆選框,每次勾選後的界面效果分別如下列三張圖片所示。
至於單選按鈕,Swing給它分配了專門的控制項類型名叫JRadioButton,該控制項的自身方法類似於JCheckBox,一樣引入了setText、getText、isSelected、setSelected等新方法替換AWT的舊方法。並且Swing給JRadioButton找了個按鈕小組搭檔,名叫ButtonGroup,只要多次調用小組對象的add方法,就能將若幹個單選按鈕加到同一小組。下麵是與ButtonGroup有關的調用代碼:
ButtonGroup group = new ButtonGroup(); // 創建一個按鈕小組 group.add(rb1); // 把單選按鈕1加入到按鈕小組 group.add(rb2); // 把單選按鈕2加入到按鈕小組 group.add(rb3); // 把單選按鈕3加入到按鈕小組
接著把JRadioButton與ButtonGroup整合在一起,打算實現簡單的點餐功能,完整的調用代碼如下所示:
JPanel panelTop = new JPanel(); // 創建頂部面板 // 創建單選按鈕,並且預設未選中 JRadioButton rb1 = new JRadioButton("魚香肉絲飯", false); // 創建單選按鈕,並且預設已選中 JRadioButton rb2 = new JRadioButton("香菇滑雞飯", true); // 創建單選按鈕,並且預設未選中 JRadioButton rb3 = new JRadioButton("黑椒牛排飯", false); panelTop.add(rb1); // 在頂部面板上添加單選按鈕 panelTop.add(rb2); // 在頂部面板上添加單選按鈕 panelTop.add(rb3); // 在頂部面板上添加單選按鈕 frame.add(panelTop, BorderLayout.NORTH); // 把頂部面板添加到視窗的北邊(上方) ButtonGroup group = new ButtonGroup(); // 創建一個按鈕小組 group.add(rb1); // 把單選按鈕1加入到按鈕小組 group.add(rb2); // 把單選按鈕2加入到按鈕小組 group.add(rb3); // 把單選按鈕3加入到按鈕小組 rb1.addItemListener(new ItemListener() { // 給單選按鈕添加一個點擊監聽器 public void itemStateChanged(ItemEvent e) { // 單選按鈕被選中 label.setText("您點了" + rb1.getText()); // 在標簽上顯示當前選中的單選按鈕文本 } }); rb2.addItemListener(new ItemListener() { // 給單選按鈕添加一個點擊監聽器 public void itemStateChanged(ItemEvent e) { // 單選按鈕被選中 label.setText("您點了" + rb2.getText()); // 在標簽上顯示當前選中的單選按鈕文本 } }); rb3.addItemListener(new ItemListener() { // 給單選按鈕添加一個點擊監聽器 public void itemStateChanged(ItemEvent e) { // 單選按鈕被選中 label.setText("您點了" + rb3.getText()); // 在標簽上顯示當前選中的單選按鈕文本 } });
運行上面的單選按鈕測試代碼,彈出視窗的初始界面如下圖所示。
然後從左往右依次單擊三個按鈕,每次單擊後的界面效果分別如下列三張圖片所示。
更多Java技術文章參見《Java開發筆記(序)章節目錄》