一.JList
JList从含义上看是一个列表,有点和JComboBox相似。其实不然,JComboBox的内容只能用一列显示出来,而JList的内容可以多列显示。
构造方法: String[] words= { "aaa", "bbb", "ccc", "ddd"};
JList wordList = new JList(words);
JList 默认多列显示,可以使用setLayoutOrientation(参数)方法来改变,共有3个参数,默认值是JList.VERTICAL。
JList.VERTICAL 只用一列来显示,但不会自动滚动,需要添加滚动面板才能出现滚动条。setVisibleRowCount(n);方法可以设置最多显示多少行(若没有添加滚动面板,此设置无效,所有内容均会显示)。
JList.VERTICAL_WRAP 纵向排列元素 。
JList.HORIZONTAL_WRAP 横向排列元素。
事件的处理,与其他控件不同,处理的不是Action事件,而是ListSelectionEvent事件,监听器为ListSelectionListener。
在这个事件处理过程中,又将鼠标的操作分为2种状态:1.按下鼠标不松手,在各个元素间拖动;2.松开鼠标。也就是说,当你按下鼠标后,会触发一个事件,拖动到另一个控件,又触发一个事件,继续拖动则继续触发事件,最后松手,触发一个事件。java 中ListSelectionEvent提供了一个方法getValueIsAdjusting(),如果该方法返回true,则代表情况1;反之代表情况2。同时请注意,JList控件不提供鼠标双击元素的处理事件。
JList 可以添加临时元素。JList 的插入与删除做不到及时更新。这个需要引用 DefaultListModel。
最后就是内部元素的绘制了。在JList中,内部显示的每一个元素叫做一个Cell。如果我想让内部元素的显示方式更完美一些,比如居中显示,比如每一个Cell字体颜色不一样,那么我们就要借助JList的setCellRenderer方法来实现。该方法接受一个实现了ListCellRenderer接口的参数,而该接口只有一个方法getListCellRendererComponent,但是,该方法的实现是比较简单的,他只需要构造一个Component对象并返回这个对象,这个对象就是一个Cell。因此,真正的难点在于,如何修改这个Component的内部显示方式,从而使得他可以满足一个Cell的显示方式。一般来讲,我们都是用一个JPanel作为绘制Cell的对象,因为在JPanel上显示文字和图像都是很方便的。最后说一个小技巧,我们实现一个类,从JPanel继承而来,同时又实现了ListCellRenderer接口,那么我们只用实现这一个类就可以了,到时候把自己返回。
二.DefaultListModel
DefaultTableMode 类 继 承 AbstractTableModel 抽象类而来,且实现了 getColumnCount() 、getRowCount()与 getValueAt()等 3 个方法。因此在实际的使用上, DefaultTableModel 比 AbstractTableModel要来得简单许多。在 DefaultTableMode 中,常常使用 Vector(向量)来填充表格中的数据。 这个时候添加到list或者Table 中,可以随时进行删除和修改。我们可以把它想成一个像Vector 那样的容器。
构造方法: DefaultTableModel mm = new DefaultTableModel(); 往mm 中添加元素。然后再用table 或者list 来显示。
三。代码
public class WordList extends JScrollPane implements
UiDataUiNotifyMessageListener{
private static final long serialVersionUID = 200903311810L;
private MutableList list = null; //MutableList 是我继承List的一个类,主要实现List之间的切换
public WordList() {
this.list = new MutableList();
list.setCellRenderer(new WordListCellRenderer()); // 这个是List 在界面中怎么显示
this.setViewportView(list);
list.getSelectionModel().setSelectionMode(
ListSelectionModel.SINGLE_SELECTION);
list.setDragEnabled(true); // 可以拖动
list.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
list.requestFocus();
}
});
}
public void notifyMessage(UiDataUiNotifyMessage message) {
***************** 给了一个监听事件,如果触发了,才往里面添加东西 ******
DefaultListModel model = new DefaultListModel();
for (WordObject WordObj : WordList ) {
model.addElement(WordObject);
}
list.setModel(model);
}
break;
default:
break;
}
}
protected class StampListCellRenderer extends DefaultListCellRenderer { // list 的绘制
private static final long serialVersionUID = 200903311514L;
public StampListCellRenderer() {
super();
}
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected,
cellHasFocus);
if (value instanceof StampObject) {
String name = ((WordObject) value).getWordName();
ImageIcon icon = ((WordObject) value).getWordImage();
Image img = icon.getImage();
img = ImageUtil.createScaleImage(img, 100, 100);
ImageIcon icon_scale = new ImageIcon(img);
setIcon(icon_scale);
setText(name);
setToolTipText(name);
}
return this;
}
}
}