無論是AWT仍是Swing,都把選擇框分紅兩類:複選框和單選按鈕,這兩類控件不管是外觀上仍是功能上均有顯著差別。例如,在外觀方面,複選框是在方框內打勾,而單選按鈕是在圓圈內畫圓點;在功能方面,複選框容許多選,而同組的單選按鈕只能選擇其中一個。然而AWT的複選框和單選按鈕通通採用Checkbox類型,區別之處在因而否加入了單選組CheckboxGroup。這不可避免又帶來困惑,一樣是Checkbox類型,代碼該如何區分某個選擇框究竟是複選框仍是單選按鈕?顯然AWT的控件設計很不合理,很是容易引發混淆,爲此Swing乾脆將它倆完全分開,各自分配對應的控件類型,今後井水不犯河水,你們才能相安無事。
Swing給複選框起的名字叫JCheckBox,該控件與AWT的Checkbox用法類似,但在細節上存在下列差別:
一、對於JCheckBox來講,setLabel方法已經廢棄,改成使用統一的setText方法來設置文本。同時獲取控件文本的getLabel方法也改爲了getText方法。
二、getState方法被直接取消了,JCheckBox改成調用isSelected方法判斷當前複選框是否選中。同時設置選中狀態的setState方法也改爲了setSelected方法。
下面是利用JCheckBox點菜的代碼例子:html
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有關的調用代碼:3d
ButtonGroup group = new ButtonGroup(); // 建立一個按鈕小組 group.add(rb1); // 把單選按鈕1加入到按鈕小組 group.add(rb2); // 把單選按鈕2加入到按鈕小組 group.add(rb3); // 把單選按鈕3加入到按鈕小組
接着把JRadioButton與ButtonGroup整合在一塊兒,打算實現簡單的點餐功能,完整的調用代碼以下所示:orm
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()); // 在標籤上顯示當前選中的單選按鈕文本 } });
運行上面的單選按鈕測試代碼,彈出窗口的初始界面以下圖所示。
htm
而後從左往右依次單擊三個按鈕,每次單擊後的界面效果分別以下列三張圖片所示。對象
更多Java技術文章參見《Java開發筆記(序)章節目錄》blog