前面介紹了兩種文本輸入框的用法,不過實際應用不多須要用戶親自文字,而是在界面上列出幾個選項,讓用戶勾勾點點完成選擇,這樣既方便也不容易弄錯。依據選擇的惟一性,可將選項控件分爲兩類:一類是在方框中打勾的複選框,多個複選框容許同時勾選;另外一類是在圓圈中點選的單選框,一組單選框最多隻能選中一個。
AWT實現複選功能的控件名叫Checkbox,它由兩部分組成,左邊部分是個支持打勾的方框,右邊部分是說明文字。Checkbox相似一種特殊的按鈕,只不過Button的文字在按鈕內部,而Checkbox的文字在方框右邊。對於說明文字來講,能夠調用setText方法設置文本內容,還可調用setFont方法設置文本字體。對於整個複選框的單擊事件而言,則需調用addItemListener方法給複選框添加點擊監聽器,一旦發生單擊事件,就會觸發監聽器的itemStateChanged方法,在該方法內便可判斷複選框的選中狀態並開展後續處理。
接下來準備在窗口上添加三個複選框,模擬餐廳的點菜過程,看看不一樣的勾選組合將會獲得怎樣的菜單。首先要在窗口上添加三個複選框對應三道菜餚,同時添加兩個文本標籤,一個標籤展現當前的勾選結果,另外一個展現已經點了的菜單,對應的控件建立與面板添加代碼以下所示:html
Label labelCenter = new Label("這裏查看勾選結果"); // 建立一個文本標籤 Panel panelCenter = new Panel(); // 建立中央面板 panelCenter.add(labelCenter); // 在中央面板上添加文本標籤 frame.add(panelCenter, BorderLayout.CENTER); // 把中央面板添加到窗口的中間位置 Label labelBottom = new Label("這裏查看點的菜單"); // 建立一個文本標籤 labelBottom.setPreferredSize(new Dimension(420, 30)); // 設置文本標籤的推薦寬高 Panel panelBottom = new Panel(); // 建立底部面板 panelBottom.add(labelBottom); // 在底部面板上添加文本標籤 frame.add(panelBottom, BorderLayout.SOUTH); // 把底部面板添加到窗口的南邊(下方) Panel panelTop = new Panel(); // 建立頂部面板 Checkbox ck1 = new Checkbox("麻婆豆腐"); // 建立一個複選框 Checkbox ck3 = new Checkbox("清蒸桂花魚"); // 建立一個複選框 Checkbox ck2 = new Checkbox("香辣小龍蝦"); // 建立一個複選框 panelTop.add(ck1); // 在頂部面板上添加複選框 panelTop.add(ck2); // 在頂部面板上添加複選框 panelTop.add(ck3); // 在頂部面板上添加複選框 frame.add(panelTop, BorderLayout.NORTH); // 把頂部面板添加到窗口的北邊(上方) Checkbox[] boxArray = new Checkbox[]{ck1, ck2, ck3}; // 構建複選框數組
而後定義一個獲取菜單描述的方法,每次變更菜單都從新調用該方法,經過複選框的getState方法判斷都有哪些菜餚被選中了。獲取菜單的方法代碼示例以下:數組
// 獲取已經選定的菜單 private static String getCheckedItem(Checkbox[] boxArray) { String itemDesc = ""; for (Checkbox box : boxArray) { // 遍歷複選框數組 if (box.getState() == true) { // 複選框被選中了 if (itemDesc.length() > 0) { itemDesc = itemDesc + "、"; } itemDesc = itemDesc + box.getLabel(); // 菜單添加選定的菜餚 } } return itemDesc; }
再給三個複選框依次添加點擊監聽器,每當發生單擊事件之時,就當即顯示勾選結果,並刷新勾選後的實時菜單。下面是分別給三個複選框註冊監聽器的代碼例子:測試
ck1.addItemListener(new ItemListener() { // 給複選框添加一個點擊監聽器 public void itemStateChanged(ItemEvent e) { // 複選框的狀態發生變化 // getStateChange方法用於獲取複選框的當前狀態。1爲勾選,0爲取消勾選 labelCenter.setText(String.format("您%s了%s", (e.getStateChange() == 1 ? "點" : "取消"), ck1.getLabel())); 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.getLabel())); 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.getLabel())); labelBottom.setText("當前已點菜餚包括:" + getCheckedItem(boxArray)); } });
運行上述整理完的複選框操做代碼,彈出的初始窗口界面以下圖所示。字體
從左往右依次勾選三個複選框,每次勾選以後的窗口界面分別以下列三張圖所示。3d
除了複選框,AXT也支持單選框,並且單選框一樣使用Checkbox實現。區別之處在於,單選框引入了選擇框小組CheckboxGroup,只要幾個Checkbox加入了同一小組,這些Checkbox通通搖身變爲圓形的單選框。一旦點擊選中某個單選框,小組內部的其他單選框都會取消選中。想讓Checkbox加入單選小組倒也簡單,調用帶三個參數的構造方法便可,第一個參數仍然是說明文字,第二個參數則是小組對象,第三個參數表示是否默認選中。故而只需在複選框的基礎上修改如下代碼,就實現了單選框的功能:orm
CheckboxGroup group = new CheckboxGroup(); // 建立一個選擇框的小組 // 建立一個加入了小組的單選框,而且默認未選中 Checkbox ck1 = new Checkbox("魚香肉絲飯", group, false); // 建立一個加入了小組的單選框,而且默認已選中 Checkbox ck2 = new Checkbox("香菇滑雞飯", group, true); // 建立一個加入了小組的單選框,而且默認未選中 Checkbox ck3 = new Checkbox("黑椒牛排飯", group, false);
把以上代碼替換進原來的複選框代碼,從新運行測試程序,彈出的初始窗口界面以下圖所示。htm
從圖示可見,套餐小組默認選中了第二個單選框的「香菇滑雞飯」。接着單擊第三個單選框的「黑椒牛排飯」,刷新後的窗口界面以下圖所示:對象
此時第三個單選框被選中,同時第二個單選框取消了選中,說明的確實現了單選框的惟一選中功能。blog
更多Java技術文章參見《Java開發筆記(序)章節目錄》事件