12.9.3 强制存储列表项的DefaultListModel和DefaultComboBoxModel
12.9.3 强制存储列表项的DefaultListModel和DefaultComboBoxModel
前面只是介绍了如何创建JList
、JComboBox
对象,当调用JList
和JComboBox
构造器时传入数组或Vector
作为参数,这些数组元素或集合元素将会作为列表项。当使用JList
或JComboBox
时常常还需要动态地增加、删除列表项。
JComboBox列表项的增加 插入 删除
对于JComboBox
类,它提供了如下几个方法来增加、插入和删除列表项:
方法 | 描述 |
---|---|
void addItem(E item) |
向JComboBox 中的添加一个列表项。 |
void insertItemAt(E item, int index) |
向JComboBox 的指定索引处插入一个列表项。 |
void removeAllItems() |
删除JComboBox 中的所有列表项。 |
void removeItem(Object anObject) |
删除JComboBox 中的指定列表项。 |
void removeItemAt(int anIndex) |
删除JComboBox 指定索引处的列表项 |
上面这些方法的参数类型是E,这是由于Java7
为JComboBox
、JList
、ListModel
都増加了泛型支持,这些接口都有形如JComboBox<E>
、JList<E>
、ListModel<E>
的泛型声明,因此它们里面的方法可使用E作为参数或返回值的类型
通过这些方法就可以增加、插入和删除JComboBox
中的列表项。
JList没有提供增加 删除列表项的方法
但JList
并没有提供这些类似的方法。实际上,对于直接通过数组或Vector
创建的JList
对象,则很难向该JList
中添加或删除列表项。
如果需要创建一个可以增加、删除列表项的JList
对象,则应该在创建JList
时显式使用DefaultListModel
作为构造参数:
方法 | 描述 |
---|---|
JList(ListModel<E> dataModel) |
Constructs a JList that displays elements from the specified, non-null, model. |
通过DefaultListModel来实现向JList中添加 插入 删除元素
因为DefaultListModel
作为JList
的Model
,它负责维护JList
组件的所有列表数据,所以可以通过向DefaultListModel
中添加、删除元素来实现向JList
对象中增加、删除列表项
DefaultListModel
提供了如下几个方法来添加、插入 删除元素。
方法 | 描述 |
---|---|
void add(int index, E element) |
在该ListModel 的指定位置处插入指定元素。 |
void addElement(E element) |
将指定元素添加到该ListModel 的末尾。 |
void insertElementAt(E element, int index) |
在该ListModel 的指定位置处插入指定元素 |
E remove(int index) |
删除该ListModel 中指定位置处的元素。 |
void removeAllElements() |
删除该ListModel 中的所有元素,并将其的大小设置为零。 |
boolean removeElement(Object obj) |
删除该ListModel 中第一个与参数匹配的元素。 |
void removeElementAt(int index) |
删除该ListModel 中指定索引处的元素。 |
上面这些方法有些功能是重复的,这是由于Java
的历史原因造成的。如果通过DefaultListModel
来创建JList
组件,则就可以通过调用上面的这些方法来添加、删除DefaultListModel
中的元素,从而实现对JList
里列表项的增加、删除。下面程序示范了如何向JList
中添加、删除列表项。
程序 使用DefaultListModel给JList 增加 插入 删除 列表项
1 | import java.awt.BorderLayout; |
上面程序中通过一个DefaultListModel
创建了一个JList
对象,然后在两个按钮的事件监听器中分别向DefaultListModel
对象中添加、删除元素,从而实现了向JList
对象中添加、删除列表项。
运行上面程序,会看到如图12.36所示的窗口。
为什么JComboBox提供添加删除列表项的方法 JList不提供
学生提问:为什么JComboBox
提供了添加、删除列表项的方法?而JList
没有提供添加、删除列表项的方法呢?
答:因为直接使用数组、Vector
创建的JList
和JComboBox
所对应的Model
实规类不同。
- 使用数组、
Vector
创建的JComboBox
的Model
类是DefaultComboBoxModel
,DefaultComboBoxModel
是一个元素可变的集合类,所以使用数组、Vector
创建的JComboBox
可以直接派加、删除列表项,因此JComboBox
提供了添加、删除列表项的方法;
- 但使用数组、
Vector
创建的JList
所对应的Model
类分别是JList$1(JList
的第一个匿名内部类)、JList$2(JList
的第二个匿名内部类)- 这两个匿名内部类都是元素不可变的集合类,所以使用数组、
Vector
创建的JList
不可以直接添加、删除列表项,因此JList
没有提供添加、删除列表项的方法。 - 如果想创建列表项可变的
JList
对象,则要显式使用DefaultListModel
对象作为Model
,而DefaultListModel
才是元素可变的集合类,才可以直接通过修改DefaultListModel
里的元素来改变JList
里的列表项。
- 这两个匿名内部类都是元素不可变的集合类,所以使用数组、
总结
DefaultListModel
和DefaultComboBoxModel
是两个强制保存所有列表项的Model
类,它们使用Vector
来保存所有的列表项。
从DefaultListModelTest
程序中可以看出,DefaultListModel
的用法和Vector
的用法非常相似。实际上,DefaultListModel
和DefaultComboBoxModel
从功能上来看,与一个Vector
并没有太大的区别。如果要创建列表项可变的JList
组件,使用DefaultListModel
作为构造方法的参数即可
创建列表项可变的JComboBox
组件,当然也可以显式使用DefaultComboBoxModel
作为参数,但这并不是必需的,因为JComboBox
已经默认使用DefaultComboBoxModel
作为对应的model
对象。