如同JList一般,在JComboBox中也有一个构造函数是利用某种Model来构造。如下所示:
JComboBox(COmboBoxModel aModel) ComboBoxModel是一个interface,里面定义了两个方法,分别是setSelectedItem()与getSelectedItem().这两个方法目的是让用 户选取某个项目后,可正确地显示出用户所选取的项目。下面是这两个方法的详细定义:
ComboBoxModel interface定义的方法:
与JList不同的是,JComboBox是利用ComboBoxModel,而不是ListModel.不过ComboBoxModel interface是继承ListModel interface ,因此若我们要利用ComboBoxModel来构造JComboBox,除了要实作ComboBoxModel的两个方法外,还必须实作ListModel的所定义的4个 方法,这样的做法可说相当麻烦。
在介绍JList时我们曾经提到AbstractListModel这个抽象类。这个抽象类实作了ListModel interface中的addListDataListener ()、removeListDataListener()这两个方法。因此若我们继承AbstractListModel,则可少掉实作这两个方法,只需要实作 getElementAt()、getSize()、setSelectedItem()与getSelectedItem()这4个方法。这样的作法就显得比较简单一点.
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class JComboBox2 { String[] s = { "美国", "日本", "大陆", "英国", "法国", "意大利", "澳洲", "韩国" }; public JComboBox2() { JFrame f = new JFrame("JComboBox2"); Container contentPane = f.getContentPane(); ComboBoxModel mode = new UserDefineComboBoxModel(); JComboBox combo = new JComboBox(mode); combo.setBorder(BorderFactory.createTitledBorder("你最喜欢到哪个国家去玩?")); contentPane.add(combo); f.pack(); f.show(); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String[] args) { new JComboBox2(); } class UserDefineComboBoxModel extends AbstractListModel implements ComboBoxModel { String item = null; public Object getElementAt(int index) { return s[index++]; } // 由于继承AbstractListModel抽象类。因此我们分别在程序中实作了getElementAt()与getSize()方法。 public int getSize() { return s.length; } // 由于我们实现了ComboBoxModel // interface.因此我们必须在程序中实作setSelectedItem()与getSelectedItem()方法. public void setSelectedItem(Object anItem) { item = (String) anItem; } public Object getSelectedItem() { return item; } } }
当程序要show出JComboBox时,系统会先自动调用getSize()方法,看看这个JComboBox长度有多少,然后再调用getElementAt() 方法,将String Array s中的值填入JComboBox中。当用户选择项目时,系统会调用getSelectedItem()方法,返回所选取的项目,并 利用setSelectedItem()方法,将选取项目放在JComboBox最前端。
getElementAt()方法中的“index”参数,系统会自动由0计算,不过要自己作累加的操作,如程序中: return s[index++];
如同JList一般,java对于JComboBox也提供了另一个类,DefaultComboBoxModel实体类。此类继承了AbstractListModel抽象类,也 实作了ComboBoxModel interface.因此你不需要再实作getSize()、getElementAt()、setSelectedItem()与getSelectedItem()方法。 利用DefaultComboBoxModel这个类我们可以很方便地做到动态更改JComboBox的项目值。当你没有必要自己定义特殊的ComboBoxModel 时,使用DefaultComboBoxModel就显得非常的方便,我们来看下面的例子:
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class JComboBox3 { String[] s = { "美国", "日本", "大陆", "英国", "法国", "意大利", "澳洲", "韩国" }; public JComboBox3() { JFrame f = new JFrame("JComboBox3"); Container contentPane = f.getContentPane(); ComboBoxModel mode = new AModel(); JComboBox combo = new JComboBox(mode); combo.setBorder(BorderFactory.createTitledBorder("您最喜欢到哪个国家玩呢?")); contentPane.add(combo); f.pack(); f.show(); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String[] args) { new JComboBox3(); } class AModel extends DefaultComboBoxModel { AModel() { for (int i = 0; i < s.length; i++) addElement(s[i]); } } }
1.由于AModel继承DefaultComboBoxModel实体类,由AModel可得到一个ComboBoxModel实体对象。
2.我们使AModel继承DefaultComboBoxModel实体类,因此就不需要再实作getElementAt()、getSize()、setSelectedItem()与 getSelectedItem()这4个方法,直接将所要的项目用addElement()方法加入即可。系统会自动将所加入的项目放进一个Vector 中,并在输出JComboBox时自动调用getSize()与getElementAt()方法。