ITEEDU

swing的版面结构

版面管理器

事件处理

鼠标事件

键盘事件处理

窗口与面板的使用

JInternalFrame的使用(窗口与面板)

JTabbedPane,JScroolPane,JScrolBa的使用

标签与按钮的使用与介绍

[复选框、选项按钮、列表方框、下拉式列表的使用与介绍]

表格(Table)的使用与介绍

JTable的事件处理

1文字输入组件的使用与介绍

树(Tree)的使用与介绍

对话框(Option Pane与Dialog)的使用与介绍

菜单与工具栏的使用与介绍

文件选择对话框,颜色选择对话框,分隔线的使用与介绍.

Slider,Timer,Progress的使用

7-4-2:利用ComboModel构造JComboBox:

如同JList一般,在JComboBox中也有一个构造函数是利用某种Model来构造。如下所示:

JComboBox(COmboBoxModel aModel) ComboBoxModel是一个interface,里面定义了两个方法,分别是setSelectedItem()与getSelectedItem().这两个方法目的是让用 户选取某个项目后,可正确地显示出用户所选取的项目。下面是这两个方法的详细定义:

ComboBoxModel interface定义的方法:

  • Object getSelectedItem():返回所选取的项目值。
  • Void setSelectedItem(Object anItem):设置所选取的项目值.

与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()方法。