列表框通過Swing組件JList產生,其總是在屏幕上占據固定行數的空間。如果要得到列表框中被選中的元素,只需調用getSelectedValuesList(),它可以產生一個字符串數組,內容為被選中的元素名稱。JList組件允許多重選擇;如果按住Ctrl鍵,可以選中所有點擊的元素;如果選中一個元素,按住Shift鍵并單擊另一個元素,那么這兩個元素之間的所有元素都被選中;要從選中的元素中去掉一個,按住Ctrl鍵單擊該元素即可。
初始化列表框后,接著便是向列表框添加和修改內容。分為靜態操作和動態操作。
1、靜態操作
靜態操作便是將所有元素同時添加到JList中,添加后不能修改,不能刪除,即在程序執行過程中不能操作列表框。
E.g.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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時將所有元素添加進去即可。
執行結果:列表框不可以被操作。
2、動態操作
通過查看JList的方法,可以發現JList不負責列表框的動態操作,所有的動態操作的細節可以在“列表模型”即DefaultListModel中完成,只需將該列表模型加入JList即可。
1
2
3
4
|
DefaultListModel listmodel = new DefaultListModel(); listmodel.addElement(element1); //添加元素 listmodel.clear(); //清除全部元素 listmodel.remove( int index); //清除指定位置的元素 |
E.g.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
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,列表模型負責完成動態操作,JList負責創建列表以及許多其它工作(如多重選擇)。 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); //啟動按鈕 } } }); list.addListSelectionListener( new ListSelectionListener(){ @SuppressWarnings ( "deprecation" ) public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting()) return ; //如果檢測到事件在更改,則返回true,后面語句不執行;當更改結束后,則返回false,執行后面語句。 for(Object item : list.getSelectedValuesList()) { text.append(item + "\n" ); //List型對象轉換為Object } //list調用getSelectedValuesList()方法,產生一個字符串數組,內容為被選中的元素名稱 } }); setLayout( new FlowLayout()); Border border = BorderFactory.createMatteBorder( 1 , 1 , 2 , 2 , Color.RED); //添加邊框 list.setBorder(border); //設置邊框 text.setBorder(border); add(button1); add(button2); add( new JScrollPane(text)); add(list); } public static void main(String[] args) { run( new ListTest(), 250 , 375 ); } } |
執行結果:
在上面的程序中,對JList的處理過程中用到了JList所支持的事件ListSelectionEvent的getValueIsAdjusting()方法以及JList的getSelectedValuesList()方法,需要注意這兩個方法的用法。
(1)Boolean javax.swing.event.ListSelectionEvent.getValueIsAdjusting()
返回此事件是否是仍然在更改的多個不同事件之一,如果此事件是仍然在更改的多個不同事件之一,則返回 true。
例如,對于選擇被更新以響應一個用戶的拖動的事件,那么在拖動開始時,此屬性被設置為 true;在拖動結束時被設置為 false。在拖動期間,監聽器接收 valueIsAdjusting 屬性設置為 true 的事件。在拖動的最后,當更改終止時,監聽器接收一個值設置為 false 的事件。
如果將JList對象的注冊程序去掉更新檢測的語句:
1
2
|
if (e.getValueIsAdjusting()) return ; |
輸出為:
可見,沒有了更新檢測,選中列表框元素后,有重復輸出。
(2)List javax.swing.JList.getSelectedValuesList()
JList對象調用getSelectedValuesList()方法,產生一個字符串數組,內容為被選中的元素名稱。
3、JList滾動條
JList本沒有對滾動提供直接的支持,我們只要將JList包裝進JScrollPane,它將自動幫助處理所有細節。
總結:JList想添加元素,可以執行將所有元素在JList初始化時加入的靜態操作,也可以利用“列表模型”DefaultListModel處理所有列表修改細節的動態操作。
注意:在JList元素選擇的過程中可能會用到更新檢測,從而確保程序的穩定性。
以上所述是小編給大家介紹的java圖形用戶界面之列表框,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:http://www.cnblogs.com/shiyiaccn/p/5978789.html