Java圖形用戶界面之列表框
列表框通過Swing組件JList產(chǎn)生,其總是在屏幕上占據(jù)固定行數(shù)的空間。如果要得到列表框中被選中的元素,只需調(diào)用getSelectedValuesList(),它可以產(chǎn)生一個(gè)字符串?dāng)?shù)組,內(nèi)容為被選中的元素名稱。JList組件允許多重選擇;如果按住Ctrl鍵,可以選中所有點(diǎn)擊的元素;如果選中一個(gè)元素,按住Shift鍵并單擊另一個(gè)元素,那么這兩個(gè)元素之間的所有元素都被選中;要從選中的元素中去掉一個(gè),按住Ctrl鍵單擊該元素即可。
初始化列表框后,接著便是向列表框添加和修改內(nèi)容。分為靜態(tài)操作和動(dòng)態(tài)操作。
1、靜態(tài)操作
靜態(tài)操作便是將所有元素同時(shí)添加到JList中,添加后不能修改,不能刪除,即在程序執(zhí)行過程中不能操作列表框。
E.g.
package test; import javax.swing.*; import java.awt.*; import static net.mindview.util.SwingConsole.*; public class ListTest1 extends JFrame{ private String[] str = {"Monday","Tuesday","Wednesday","Thursday","Friday","Staturday","Sunday"}; private JList list;public ListTest1() { list = new JList(str); setLayout(new FlowLayout()); add(list); } public static void main(String[] args) { run(new ListTest1(),200,100); } }
如上例,只要在初始化JList時(shí)將所有元素添加進(jìn)去即可。
執(zhí)行結(jié)果:列表框不可以被操作。
2、動(dòng)態(tài)操作
通過查看JList的方法,可以發(fā)現(xiàn)JList不負(fù)責(zé)列表框的動(dòng)態(tài)操作,所有的動(dòng)態(tài)操作的細(xì)節(jié)可以在“列表模型”即DefaultListModel中完成,只需將該列表模型加入JList即可。
DefaultListModel listmodel = new DefaultListModel(); listmodel.addElement(element1);//添加元素 listmodel.clear();//清除全部元素 listmodel.remove(int index);//清除指定位置的元素
E.g.
package test; import java.awt.*;import java.awt.event.*;import static net.mindview.util.SwingConsole.*; import javax.swing.*; import javax.swing.border.Border; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; public class ListTest extends JFrame{ private String[] str = {"Monday","Tuesday","Wednesday","Thursday","Friday","Staturday","Sunday"}; private JButton button1 = new JButton("Add Item"), button2 = new JButton("Clear Item"); private JTextArea text = new JTextArea(str.length,20); private DefaultListModel listmodel = new DefaultListModel(); private JList list = new JList(listmodel); //將列表模型加入JList,列表模型負(fù)責(zé)完成動(dòng)態(tài)操作,JList負(fù)責(zé)創(chuàng)建列表以及許多其它工作(如多重選擇)。 private int count = 0; private boolean flag = false; public ListTest() { text.setEditable(false);//只是用來顯示,不能編輯 for(int i = 0;i<4;i++) { listmodel.addElement(str[count++]); } button1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { if(count<str.length) { listmodel.addElement(str[count++]); }else { button1.setEnabled(flag); flag = true; } } }); button2.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { if(count<str.length) { count = 0;//列表重新開始添加元素 listmodel.clear();//列表元素清除 text.setText(null); }else { count = 0; listmodel.clear(); text.setText(null); button1.setEnabled(flag);//啟動(dòng)按鈕 } } }); list.addListSelectionListener(new ListSelectionListener(){ @SuppressWarnings("deprecation") public void valueChanged(ListSelectionEvent e) { if(e.getValueIsAdjusting()) return; //如果檢測(cè)到事件在更改,則返回true,后面語句不執(zhí)行;當(dāng)更改結(jié)束后,則返回false,執(zhí)行后面語句。 for(Object item : list.getSelectedValuesList()) { text.append(item + "\n");//List型對(duì)象轉(zhuǎn)換為Object } //list調(diào)用getSelectedValuesList()方法,產(chǎn)生一個(gè)字符串?dāng)?shù)組,內(nèi)容為被選中的元素名稱 } }); setLayout(new FlowLayout()); Border border = BorderFactory.createMatteBorder(1, 1, 2, 2, Color.RED);//添加邊框 list.setBorder(border);//設(shè)置邊框 text.setBorder(border); add(button1); add(button2); add(new JScrollPane(text)); add(list); } public static void main(String[] args) { run(new ListTest(),250,375); } }
執(zhí)行結(jié)果:
在上面的程序中,對(duì)JList的處理過程中用到了JList所支持的事件ListSelectionEvent的getValueIsAdjusting()方法以及JList的getSelectedValuesList()方法,需要注意這兩個(gè)方法的用法。
(1)Boolean javax.swing.event.ListSelectionEvent.getValueIsAdjusting()
返回此事件是否是仍然在更改的多個(gè)不同事件之一,如果此事件是仍然在更改的多個(gè)不同事件之一,則返回 true。
例如,對(duì)于選擇被更新以響應(yīng)一個(gè)用戶的拖動(dòng)的事件,那么在拖動(dòng)開始時(shí),此屬性被設(shè)置為 true;在拖動(dòng)結(jié)束時(shí)被設(shè)置為 false。在拖動(dòng)期間,監(jiān)聽器接收 valueIsAdjusting 屬性設(shè)置為 true 的事件。在拖動(dòng)的最后,當(dāng)更改終止時(shí),監(jiān)聽器接收一個(gè)值設(shè)置為 false 的事件。
如果將JList對(duì)象的注冊(cè)程序去掉更新檢測(cè)的語句:
if(e.getValueIsAdjusting()) return;
輸出為:
可見,沒有了更新檢測(cè),選中列表框元素后,有重復(fù)輸出。
(2)List javax.swing.JList.getSelectedValuesList()
JList對(duì)象調(diào)用getSelectedValuesList()方法,產(chǎn)生一個(gè)字符串?dāng)?shù)組,內(nèi)容為被選中的元素名稱。
3、JList滾動(dòng)條
JList本沒有對(duì)滾動(dòng)提供直接的支持,我們只要將JList包裝進(jìn)JScrollPane,它將自動(dòng)幫助處理所有細(xì)節(jié)。
總結(jié):JList想添加元素,可以執(zhí)行將所有元素在JList初始化時(shí)加入的靜態(tài)操作,也可以利用“列表模型”DefaultListModel處理所有列表修改細(xì)節(jié)的動(dòng)態(tài)操作。
注意:在JList元素選擇的過程中可能會(huì)用到更新檢測(cè),從而確保程序的穩(wěn)定性。
以上所述是小編給大家介紹的java圖形用戶界面之列表框,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
IDEA @SpringBootApplication報(bào)錯(cuò)原因及解決
這篇文章主要介紹了IDEA @SpringBootApplication報(bào)錯(cuò)原因及解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01SpringBoot項(xiàng)目運(yùn)行jar包啟動(dòng)的步驟流程解析
這篇文章主要介紹了SpringBoot項(xiàng)目運(yùn)行jar包啟動(dòng)的步驟流程,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-07-07Java線程和操作系統(tǒng)線程的關(guān)系解讀
這篇文章主要介紹了Java線程和操作系統(tǒng)線程的關(guān)系解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06SpringBoot居然有44種應(yīng)用啟動(dòng)器,你都知道嗎
很多人都不知道SpringBoot應(yīng)用啟動(dòng)器竟然有44個(gè),本文就一起來介紹一下,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2021-01-01Mysql存儲(chǔ)java對(duì)象實(shí)例詳解
這篇文章主要介紹了Mysql存儲(chǔ)java對(duì)象實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-11-11java使用任務(wù)架構(gòu)執(zhí)行任務(wù)調(diào)度示例
在Java 5.0之前啟動(dòng)一個(gè)任務(wù)是通過調(diào)用Thread類的start()方法來實(shí)現(xiàn)的,5.0里提供了一個(gè)新的任務(wù)執(zhí)行架構(gòu)使你可以輕松地調(diào)度和控制任務(wù)的執(zhí)行,并且可以建立一個(gè)類似數(shù)據(jù)庫連接池的線程池來執(zhí)行任務(wù),下面看一個(gè)示例2014-01-01