http://blog.csdn.net/songsz123/article/details/7186999
今天从《java核心编程》中学习了JList 的用法,写下自己的感受,以免时间久了又忘记了。
String[] words= { "quick", "brown", "hungry", "wild"};
JList wordList = new JList(words);
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控件不提供鼠标双击元素的处理事件,若要处理鼠标双击的情况,则应该添加鼠标监听器,代码如下:
public void mouseClicked(MouseEvent evt)
...{
if (evt.getClickCount() == 2)
...{
JList source = (JList) evt.getSource();
Object[] selection = source.getSelectedValues();
doAction(selection);
}
}
...{
}
class WordListModel extends AbstractListModel
...{
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';
}
...{
}
class FontCellRenderer extends JPanel implements ListCellRenderer
...{
public Component getListCellRendererCompo
nent(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;
}
...{
}
=======================
paintComponent定义在JComponent中,这个类是所有非窗口Swing组件的超类,只要窗口需要重新绘图,事件处理器就会通告组件,从而引发执行所有组件的paintComponent方法。一定不要自己调用paintComponent方法。--摘自《Java核心技术》