Java開發筆記(一百三十一)Swing的列表框

前面介紹了選擇框的用法,當時爲了方便用戶勾勾點點,不管是複選框仍是單選按鈕,通通把全部選項都擺在界面上。假若只有兩三個選項還好辦,要是選項數量變多好比超過五個,這麼多的選擇框一齊在界面羅列,不光程序員排版費勁,用戶瞅着也容易眼花。鑑於這些選擇框每每選完一次就了事,可貴有從新選擇第二次的機會,於是在界面上所有鋪開這些選擇框實屬浪費。更好的作法是在選擇的時候才展開全部選項,選完以後就縮回只顯示選中的那一項,一伸一縮之間才能充分利用有限的屏幕界面。
以單選按鈕的組合爲例,許多個單選按鈕只能選擇其中一個,這種狀況就很適合展開與收縮的處理邏輯。Swing給該場景提供了專門的下拉框控件JComboBox,爲了往下拉框塞進各個選項,還須要將它與下拉框模型DefaultComboBoxModel搭配使用才行。下拉框具體的調用過程分爲下列三個步驟:
一、建立一個下拉框模型,並調用模型對象的addElement方法依次添加每一個選項;
二、建立一個下拉框控件,注意要在JComboBox的構造方法中填入第一步的模型對象;
三、調用下拉框對象的addItemListener方法給它添加一個點擊監聽器,每當用戶在下拉麪板中選擇某一項,都會觸發監聽器的itemStateChanged方法。此時便可經過下拉框對象的getSelectedIndex方法得到選中項的序號,還可經過getSelectedItem方法得到選中項的對象。
下面是利用JComboBox實現下拉選擇功能的代碼例子:html

		JPanel panelTop = new JPanel(); // 建立頂部面板
		// 建立一個下拉框模型
		DefaultComboBoxModel<String> comboModel = new DefaultComboBoxModel<String>();
		comboModel.addElement("魚香肉絲飯"); // 往下拉模型中添加元素
		comboModel.addElement("香菇滑雞飯"); // 往下拉模型中添加元素
		comboModel.addElement("黑椒牛排飯"); // 往下拉模型中添加元素
		comboModel.addElement("梅菜扣肉飯"); // 往下拉模型中添加元素
		comboModel.addElement("糖醋里脊飯"); // 往下拉模型中添加元素
		comboModel.addElement("紅燒排骨飯"); // 往下拉模型中添加元素
		comboModel.addElement("臺式滷肉飯"); // 往下拉模型中添加元素
		JComboBox<String> comboBox = new JComboBox<String>(comboModel); // 建立一個下拉框
		panelTop.add(comboBox); // 在頂部面板上添加下拉框
		frame.add(panelTop, BorderLayout.NORTH); // 把頂部面板添加到窗口的北邊(上方)
		comboBox.setEditable(false); // 設置下拉框可否編輯。默認不容許編輯
		comboBox.addItemListener(new ItemListener() { // 給下拉框添加一個點擊監聽器
			public void itemStateChanged(ItemEvent e) { // 下拉框被選擇
				// 獲取下拉框內選中項的序號及其描述
				// getSelectedIndex方法可得到選中項的序號,getSelectedItem方法可得到選中項的對象
				String desc = String.format("您點了第%d項,套餐名稱是%s", 
						comboBox.getSelectedIndex(), comboBox.getSelectedItem().toString());
				label.setText(desc); // 在標籤上顯示當前選中的文本項
			}
		});

 

運行上面的下拉框代碼,彈出以下圖所示的窗口界面,可見一開始下拉框只佔據長條般的空間,而且默認展現第一個選項。程序員


接着單擊下拉框的長條區域,界面會向下彈出包含全部選項的下拉麪板,選中面板上的某一項後,下拉麪板消失不見,同時長條框內的文字變成了剛纔選中項的文本。選擇先後的窗口界面分別如如下兩張圖所示。orm


雖然下拉框比起單選按鈕組合要節省屏幕空間,但它的實現機制也致使了以下幾點侷限:
一、下拉框只實現了單選功能,不支持多選功能,沒法同時選擇好幾個選項;
二、從新選擇之時,要先點一下長條區域,才能在彈出的下拉麪板中挑選新的選項,簡簡單單的選擇操做也花費了兩個步驟,甚不經濟;
以上兩點侷限的原由,皆來源於下拉麪板的彈出與縮回機制,每次都要單擊長條框纔會彈出下拉麪板,單擊選中某一項後又會自動關閉下拉麪板,正是這種單次點擊單次響應的行爲決定了下拉框只能用於單選操做,而不能用於多選操做。要想實現多選功能,還得將全部選項鋪開展現,就像文件列表那樣,用戶才能按下Ctrl鍵逐個選中,或者按下Shift鍵選擇一段連續的數個選項。這種平鋪直敘全部選項的控件也叫列表框,對應於Swing中的JList類型,列表框的用法相似下拉框,它的調用過程依然分爲如下三個步驟:
一、建立一個列表框模型DefaultListModel,並調用模型對象的addElement方法依次添加每一個選項;
二、建立一個列表框控件,注意要在JList的構造方法中填入第一步的模型對象;
三、調用列表框對象的addListSelectionListener方法給它添加一個點擊監聽器,每當用戶單擊列表框中的某一項,都會觸發監聽器的valueChanged方法。此時便可經過列表框對象的getSelectedIndex方法得到選中項的序號,經過getSelectedValue方法得到選中項的值,還能經過getSelectedValuesList方法得到全部選中項的值列表。
下面是利用JList實現屢次選擇功能的代碼例子:htm

		JPanel panelLeft = new JPanel(); // 建立左邊面板
		// 建立一個列表框模型
		DefaultListModel<String> listModel = new DefaultListModel<String>();
		listModel.addElement("魚香肉絲飯"); // 往列表模型中添加元素
		listModel.addElement("香菇滑雞飯"); // 往列表模型中添加元素
		listModel.addElement("黑椒牛排飯"); // 往列表模型中添加元素
		listModel.addElement("梅菜扣肉飯"); // 往列表模型中添加元素
		listModel.addElement("糖醋里脊飯"); // 往列表模型中添加元素
		listModel.addElement("紅燒排骨飯"); // 往列表模型中添加元素
		listModel.addElement("臺式滷肉飯"); // 往列表模型中添加元素
		JList<String> listBox = new JList<String>(listModel); // 建立一個列表框
		panelLeft.add(listBox); // 在頂部面板上添加列表框
		frame.add(panelLeft, BorderLayout.WEST); // 把頂部面板添加到窗口的西邊(左側)
		listBox.addListSelectionListener(new ListSelectionListener() { // 給列表框添加一個點擊監聽器
			public void valueChanged(ListSelectionEvent arg0) { // 列表框被選擇
				// 獲取列表框內選中項的序號及其描述
				// getSelectedIndex方法可得到選中項的序號,getSelectedValue方法可得到選中項的值
				String desc = String.format("您點了第%d項,套餐名稱是%s", 
						listBox.getSelectedIndex(), listBox.getSelectedValue());
				labelBottom.setText(desc); // 在標籤上顯示當前選中的文本項
				String total = "<html>您已選擇的套餐列表以下:<br>";
				// 獲取列表框內的全部選擇項,並拼接html格式的描述串
				for (String str : listBox.getSelectedValuesList()) {
					total = String.format("%s<center>%s</center>", total, str);
				}
				total += "</html>";
				labelCenter.setText(total); // 在標籤上顯示全部選中的文本項
			}
		});

 

運行以上的列表框代碼,彈出以下圖所示的窗口界面,可見列表框一開始就展現了全部選項。對象


而後按住Ctrl鍵,從下往上依次單擊選中第七項、第五項、第三項、第一項,每次單擊以後的界面效果分別如如下四張圖片所示。blog


從這些效果圖能夠看到,在按住Ctrl鍵的時候,列表框能夠實現多選功能;未按住Ctrl鍵的時候,列表框變成實現單選功能。圖片



更多Java技術文章參見《Java開發筆記(序)章節目錄開發

相關文章
相關標籤/搜索