列表框通过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