前面介紹了選擇框的用法,當時爲了方便用戶勾勾點點,不管是複選框仍是單選按鈕,通通把全部選項都擺在界面上。假若只有兩三個選項還好辦,要是選項數量變多好比超過五個,這麼多的選擇框一齊在界面羅列,不光程序員排版費勁,用戶瞅着也容易眼花。鑑於這些選擇框每每選完一次就了事,可貴有從新選擇第二次的機會,於是在界面上所有鋪開這些選擇框實屬浪費。更好的作法是在選擇的時候才展開全部選項,選完以後就縮回只顯示選中的那一項,一伸一縮之間才能充分利用有限的屏幕界面。
以單選按鈕的組合爲例,許多個單選按鈕只能選擇其中一個,這種狀況就很適合展開與收縮的處理邏輯。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開發筆記(序)章節目錄》開發