JList wordList = new JList(words);
setVisibleRowCount(n);方法可以设置最多显示多少行(若没有添加滚动面板,此设置无效,所有内容均会显示)。
另外两个参数是JList.VERTICAL_WRAP和JList.HORIZONTAL_WRAP,其含义分别是“在保证行数不超过setVisibleRowCount(n)的情况下,纵向或横向排列元素”。此时滚动面板无效,因为行数永远不可能超标,因此滚动面板也永远不会出现。比如最大显示行数为4,总共有5个元素,显示结果如下:
1.按下鼠标不松手,在各个元素间拖动;
2.松开鼠标。
也就是说,当你按下鼠标后,会触发一个事件,拖动到另一个控件,又触发一个事件,继续拖动则继续触发事件,最后松手,触发一个事件。那么,你如何区分这2种情况呢?ListSelectionEvent提供了一个方法getValueIsAdjusting(),如果该方法返回true,则代表情况1;反之代表情况2。同时请注意,JList控件不提供鼠标双击元素的处理事件,若要处理鼠标双击的情况,则应该添加鼠标监听器,代码如下:
...{
if (evt.getClickCount() == 2)
...{
JList source = (JList) evt.getSource();
Object[] selection = source.getSelectedValues();
doAction(selection);
}
}
...{
public WordListModel(int n) ...{ length = n; }
public int getSize()
...{
return (int) Math.pow(LAST - FIRST + 1, length);
}
public Object getElementAt(int n)
...{
StringBuilder r = new StringBuilder();;
for (int i = 0; i < length; i++)
...{
char c = (char)(FIRST + n % (LAST - FIRST + 1));
r.insert(0, c);
n = n / (LAST - FIRST + 1);
}
return r;
}
private int length;
public static final char FIRST = 'a';
public static final char LAST = 'z';
}
...{
public Component getListCellRendererComponent(JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus)
...{
text = (String)value;
background = isSelected ? list.getSelectionBackground() : list.getBackground();
foreground = isSelected ? list.getSelectionForeground() : list.getForeground();
return this;
}
public void paintComponent(Graphics g)
...{
g.setColor(background);
g.fillRect(0, 0, getWidth(), getHeight()); //设置背景色
g.setColor(foreground);
g.drawString(text, 5, 15); //在制定位置绘制文本
}
public Dimension getPreferredSize()
...{
return new Dimension(30, 20); //Cell的尺寸
}
private String text;
private Color background;
private Color foreground;
}