Java開發筆記(一百二十二)AWT選擇框

前面介紹了兩種文本輸入框的用法,不過實際應用不多須要用戶親自文字,而是在界面上列出幾個選項,讓用戶勾勾點點完成選擇,這樣既方便也不容易弄錯。依據選擇的惟一性,可將選項控件分爲兩類:一類是在方框中打勾的複選框,多個複選框容許同時勾選;另外一類是在圓圈中點選的單選框,一組單選框最多隻能選中一個。
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開發筆記(序)章節目錄事件

相關文章
相關標籤/搜索