1. 列表
1.1 JList构件
JList可以将多个选项放置在单个框中。为了构建列表框,首先需要创建一个字符串数组,然后将这个数组传递给JList构造器。
String[] words= { "quick", "brown", "hungry", "wild", . . . };
JList wordList = new JList<>(words);
列表框不能自动滚动,要想为列表框加上滚动条,必须将它插入到一个滚动面板中:
JScrollPane scrollPane = new JScrollPane(wordList);
然后应该应该把滚动面板而不是列表框,插入到外围面板上。
默认情况下,列表框构件可以显示8个选项;可以使用setVisibleRowCount方法改变这个值:
wordList.setVisibleRowCount(4); //display 4 items
还可以使用以下三个值中的任意一个来设置列表框摆放的方向:
• JList.VERTICAL ( 默认值) :垂直摆放所有选项。
• JList.VERTICAL_WRAP: 如果选项数超过了可视行数,就开始新的一列。
• JList.HORIZONTAL_WRAP: 如果选项数超过了可视行数,就开始新的一行,并且按照水平方向进行填充。
在默认的情况下,用户可以选择多个选项。为了选择多个选项,只需要按住CTRL键,然后在要选择的选项上单击。要选择处于连续范围内的选项,首先选择第一个选项,然后按住SHIFT键,并在最后一个选项上点击即可。
使用setSelectionMode方法,还可以对用户的选择模式加以限制:
wordList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//select one item at a time
wordList.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);//select one item or one range of items
列表框使用一种不同的事件通知机制,它不需要监听动作事件,而是监听列表选择事件。可以向列表构件添加一个列表选择监听器,然后在监听器中实现下面这个方法:
public void valueChanged(ListSelectionEvent evt)
在用户选择了若干个选项的同时,将产生一系列列表选择事件。假如用户在一个新选项上单击,当鼠标按下的时候,就会有一个事件来报告选项的改变。这是一种过渡型事件,在调用event.getValueIsAdjusting()时,如果该选择仍未最终结束则返回true。然后,当松开鼠标时,就产生另一事件,此时event.getValueIsAdjusting()返回false。如果你对这种过渡型事件不感兴趣,那么可以等待event.getValueIsAdjusting()调用返回false的事件。不过,如果希望只是要点击鼠标就给用户一个即时反馈,那么就需要处理所有的事件。
一旦被告知某个事件已经发生,那么就需要弄清楚当前选择了哪些选项。如果是单选模式,调用getSelectedValue可以获取所有选中列表的元素的值;否则调用getSelectedValues返回一个包含所有选中选项的对象数组。之后,可以以常规方式处理它。
for(String value : wordList.getSelectedValuesList())//do something with value
注意:列表构件不响应鼠标的双击事件。正如Swing设计者所构想的那样,使用列表选择一个选项,然后点击某个按钮执行某个动作。但是,某些用户界面允许用户在一个列表选项上双击鼠标,作为选择一个选项并调用一个默认动作的快捷方式。如果想实现这中行为,那么必须对这个列表框添加一个鼠标监听器,然后按照下面这样捕获鼠标事件:
public voidmouseClicked(MouseEvent evt)
{if (evt.getClickCount() == 2)
{
JList source=(JList) evt.getSource();
Object[] selection=source.getSelectedValues();
doAction(selection);
}
}
下面的程序展示了一个填入字符串的列表框。请注意valueChanged方法是怎样根据被选项来创建消息字符的。
packagelist;importjava.awt.BorderLayout;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;import javax.swing.*;importjavax.swing.event.ListSelectionEvent;importjavax.swing.event.ListSelectionListener;public class ListFrame extendsJFrame {private static final int DEFAULT_WIDTH=400;private static final int DEFAULT_HEIGHT=300;privateJPanel listPanel;private JListwordlist;privateJLabel label;privateJPanel buttonPanel;privateButtonGroup group;private String prefix="The ";private String suffix