Swing JComboBox的使用
1:JComboBox的使用:
类层次结构图:
- java.lang.Object
- --java.awt.Component
- --java.awt.Container
- --javax.swing.JComponent
- --javax.swing.JComboBox
构造函数:
- JComboBox():建立一个新的JComboBox组件。
- JComboBox(ComboBoxModel aModel):用ListModel建立一个新的JComboBox组件。
- JComboBox(Object[] items):利用Array对象建立一个新的JComboBox组件。
- JComboBox(Vector items):利用Vector对象建立一个新的JComboBox组件。
1-1:建立一般的JComboBox:
- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- import java.util.Vector;
- public class JComboBox1{
- public static void main(String[] args){
- JFrame f=new JFrame("JComboBox1");
- Container contentPane=f.getContentPane();
- contentPane.setLayout(new GridLayout(1,2));
- String[] s = {"美国","日本","大陆","英国","法国","意大利","澳洲","韩国"};
- Vector v=new Vector();
- v.addElement("Nokia 8850");
- v.addElement("Nokia 8250");
- v.addElement("Motorola v8088");
- v.addElement("Motorola v3850");
- v.addElement("Panasonic 8850");
- v.addElement("其它");
- JComboBox combo1=new JComboBox(s);
- combo1.addItem("中国");//利用JComboBox类所提供的addItem()方法,加入一个项目到此JComboBox中。
- combo1.setBorder(BorderFactory.createTitledBorder("你最喜欢到哪个国家玩呢?"));
- JComboBox combo2=new JComboBox(v);
- combo2.setBorder(BorderFactory.createTitledBorder("你最喜欢哪一种手机呢?"));
- contentPane.add(combo1);
- contentPane.add(combo2);
- f.pack();
- f.show();
- f.addWindowListener(new WindowAdapter(){
- public void windowClosing(WindowEvent e){
- System.exit(0);
- }
- });
- }
- }
1-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()方法。
1-3:建立有图像的JComboBox:
在上一节中我们利用ListCellRenderer interface在JList中加入Icon图像,而要在JComboBox中加入图像的方法也是一样的。
我们必须实作ListCellRenderer interface所定义的方法getListCellRendererComponent.以下为这个方法的定义:
要先了解ListCellRenderer interface.我们必须由这个interface所定义的方法,将图像画在JComboBox中的每个项目。
ListCellRenderer interface里只定义了一个方法,那就是getListCellRendererComponent,不过这个参数有点多,我们把它列出来
看看:
- public Component getListCellRendererComponent(JList list,
- Object value,
- int index,
- boolean isSelected,
- boolean cellHasFocus)
list:即所要画上的图像的JComboBox组件。
value:JComboBox项目值,如JComboBox.getModel().getElementAt(index)所返回的值。
index:为JComboBox项目的索引值,由0开始。
isSelected与cellHasFocus:判断JComboBox中的项目是否有被选取或是有焦点置入。
上面这4个参数会在你设置JComboBox的绘图样式(setCellRenderer())时自动的由JComboBox组件提供,你只要关心怎么控制
getListCellRendererComponent()方法中的4个参数,而无需担心怎么参数传入。
要在JList中加入Icon图像的技巧就是将JComboBox中的每一个项目当作是JLabel,因为JLabel在使用文字与图像上非常的方便,要设置JComboBox的图像,
必须使用setRenderer(ListCellRenderer cellRenderer){注:我们在JList中画上图像是利用JList所提供的setCellRenderer(ListCellRenderer
cellRenderer)方法,读者请小心}这个方法。我们来看下面这个范例,你就能明白了!
- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- public class JComboBox4{
- String[] s={"西瓜","苹果","草莓","香蕉","葡萄"};
- public JComboBox4(){
- JFrame f=new JFrame("JComboBox");
- Container contentPane=f.getContentPane();
- JComboBox combo=new JComboBox(s);
- combo.setBorder(BorderFactory.createTitledBorder("你最喜欢吃哪些水果?"));
- combo.setRenderer(new ACellRenderer());
- combo.setMaximumRowCount(3);
- 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 JComboBox4();
- }
- }
- class ACellRenderer extends JLabel implements ListCellRenderer{
- ACellRenderer(){
- setOpaque(true);
- }
- public Component getListCellRendererComponent(JList list,
- Object value,
- int index,
- boolean isSelected,
- boolean cellHasFocus){
- if (value!=null){
- setText(value.toString());
- setIcon(new ImageIcon(".\\icons\\fruit"+(index+1)+".jpg"));
- }
- if (isSelected){
- setBackground(list.getSelectionBackground());
- setForeground(list.getSelectionForeground());
- }else{
- setBackground(list.getBackground());
- setForeground(list.getForeground());
- }
- return this;
- }
- }
各们读者在运行这个程序时会发现,即使JComboBox的选项中有图标,但在选后图标却不会显示在显示列中,原因是在上面程序中
我们以String Array s建立JComboBox:
JComboBox combo=new JComboBox(s);
String Array s里面放的只是水果名称,而并没有图标。当我们使用setRenderer()方法来JComboBox时,只会绘制JComboBox的
选项部份,而最后显示在JComboBox上的值还是以String Array s为依据。因此JComboBox显示列就只会显示文字而已,而不会显示出
图形。要解决这个问题,我们必须改变JComboBox所传入的参数内容,也就是将原来的String Array s更改成具有图形的数据项。在
此我们是利用JComboBox(Object[] items)来建立有图像的JComboBox,我们所传进去的Object Array不应该只有文字,而必须连图标一
并传入。我们修改上个范例修改如下:
- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- public class JComboBox5
- {
- String[] s = {"西瓜","苹果","草莓","香蕉","葡萄"};
- ImageIcon[] icons = new ImageIcon[5];;
- public JComboBox5()
- {
- JFrame f = new JFrame("JComboBox");
- Container contentPane = f.getContentPane();
- ItemObj[] obj = new ItemObj[5];
- for(int i=0; i < 5; i++)
- {
- icons[i] = new ImageIcon(".\\icons\\fruit"+(i+1)+".jpg");
- obj[i] = new ItemObj(s[i],icons[i]);
- }
- JComboBox combo = new JComboBox(obj);//利用ItemObj Array obj当作是JComboBox的参数传入,构造出JComboBox.
- combo.setBorder(BorderFactory.createTitledBorder("您喜欢吃哪些水果?"));
- combo.setRenderer(new ACellRenderer());
- combo.setMaximumRowCount(3);
- 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 JComboBox5();
- }
- }
- class ItemObj
- {
- String name;
- ImageIcon icon;
- public ItemObj(String name, ImageIcon icon){
- this.name = name;
- this.icon = icon;
- }
- }
- class ACellRenderer extends JLabel implements ListCellRenderer
- {
- ACellRenderer()
- {
- setOpaque(true);
- }
- public Component getListCellRendererComponent(JList list,
- Object value,
- int index,
- boolean isSelected,
- boolean cellHasFocus)
- {
- if (value != null)
- {
- setText(((ItemObj)value).name);
- setIcon(((ItemObj)value).icon);
- }
- if (isSelected) {
- setBackground(list.getSelectionBackground());
- setForeground(list.getSelectionForeground());
- }
- else {
- setBackground(list.getBackground());
- setForeground(list.getForeground());
- }
- return this;
- }
- }
你可以发现,第一栏显示有图标显示出来了。当然你也可以利用ComboBoxModel方式来构造出有图标的JComboBox.我们来看下面
的例子:
- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- public class JComboBox6{
- String[] s={"西瓜","苹果","草莓","香蕉","葡萄"};
- ImageIcon[] icons=new ImageIcon[5];
- public JComboBox6(){
- JFrame f=new JFrame("JComboBox");
- Container contentPane=f.getContentPane();
- for(int i=0; i < 5; i++)
- {
- icons[i] = new ImageIcon(".\\icons\\fruit"+(i+1)+".jpg");
- }
- ComboBoxModel mode=new AModel();
- JComboBox combo=new JComboBox(mode);
- combo.setBorder(BorderFactory.createTitledBorder("您喜欢吃哪些水果?"));
- combo.setRenderer(new ACellRenderer());
- combo.setMaximumRowCount(3);
- 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 JComboBox6();
- }
- /*我们用JComboBox(ComboBoxModel aModel)来构造图标的JComboBox,因此我们在程序中编写一个继承DefaultComboBoxModel的
- ComboBoxModel.
- */
- class AModel extends DefaultComboBoxModel{
- AModel(){
- for (int i=0;i<s.length;i++){
- ItemObj obj=new ItemObj(s[i],icons[i]);
- addElement(obj);
- }
- }
- }
- }
- class ItemObj
- {
- String name;
- ImageIcon icon;
- public ItemObj(String name, ImageIcon icon){
- this.name = name;
- this.icon = icon;
- }
- }
- class ACellRenderer extends JLabel implements ListCellRenderer
- {
- ACellRenderer()
- {
- setOpaque(true);
- }
- public Component getListCellRendererComponent(JList list,
- Object value,
- int index,
- boolean isSelected,
- boolean cellHasFocus)
- {
- if (value != null)
- {
- setText(((ItemObj)value).name);
- setIcon(((ItemObj)value).icon);
- }
- if (isSelected) {
- setBackground(list.getSelectionBackground());
- setForeground(list.getSelectionForeground());
- }
- else {
- setBackground(list.getBackground());
- setForeground(list.getForeground());
- }
- return this;
- }
- }
- 我们用JComboBox(ComboBoxModel aModel)来构造图标的JComboBox,因此我们在程序中编写一个继承DefaultComboBoxModel的
- ComboBoxModel.
1-4:建立可自行输入的JComboBox:
- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- public class JComboBox7
- {
- String[] fontsize = {"12","14","16","18","20","22","24","26","28"};
- String defaultMessage = "请选择或直接输入文字大小!";
- public JComboBox7()
- {
- JFrame f = new JFrame("JComboBox");
- Container contentPane = f.getContentPane();
- JComboBox combo = new JComboBox(fontsize);
- combo.setBorder(BorderFactory.createTitledBorder("请选择你要的文字大小"));
- combo.setEditable(true);//将JComboBox设成是可编辑的.
- ComboBoxEditor editor = combo.getEditor();//getEditor()方法返回ComboBoxEditor对象,如果你查看手册,你就会发
- //现ComboBoxEditor是个接口(interface),因此你可以自行实作这个接口,制作自己想要的ComboBoxEditor组件。但通常
- //我们不需要这么做,因为默认的ComboBoxEditor是使用JTextField,这已经足够应付大部份的情况了。
- //configureEditor()方法会初始化JComboBox的显示项目。例如例子中一开始就出现:"请选择或直接输入文字大小!"这个
- //字符串。
- combo.configureEditor(editor, defaultMessage);
- 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 JComboBox7();
- }
- }
1-5:JComboBox的事件处理:
JComboBox的事件处理亦可分为两种,一种是取得用户选取的项目;另一种是用户在JComboBox上自行输入完毕后按下[Enter]键,
运作相对应的工作。对于第一种事件的处理,我们使用ItemListener.对于第二种事件的处理,我们使用ActionListener.
这个范例用户可以选取所要的字号,字号的变化会呈现在JLabel上,并可让用户自行输入字体的大小。当用户按下[Enter]键后
,若用户输入的值不在选项上时,此输入值会增加至JComboBox中,并将输入字体的大小显示在JLabel上。
- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- public class JComboBox8 implements ItemListener,ActionListener{
- String[] fontsize={"12","14","16","18","20","22","24","26","28"};
- String defaultMessage="请选择或直接输入文字大小!";
- Font font=null;
- JComboBox combo=null;
- JLabel label=null;
- public JComboBox8(){
- JFrame f=new JFrame("JComboBox");
- Container contentPane=f.getContentPane();
- contentPane.setLayout(new GridLayout(2,1));
- label=new JLabel("Swing",JLabel.CENTER);
- font=new Font("SansSerif",Font.PLAIN,12);
- label.setFont(font);
- combo=new JComboBox(fontsize);
- combo.setBorder(BorderFactory.createTitledBorder("请选择你要的文字大小:"));
- combo.setEditable(true);
- ComboBoxEditor editor=combo.getEditor();
- combo.configureEditor(editor,defaultMessage);
- combo.addItemListener(this);0
- combo.addActionListener(this);
- contentPane.add(label);
- 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 JComboBox8();
- }
- public void actionPerformed(ActionEvent e){
- boolean isaddItem=true;
- int fontsize=0;
- String tmp=(String)combo.getSelectedItem();
- //判断用户所输入的项目是否有重复,若有重复则不增加到JComboBox中。
- try{
- fontsize=Integer.parseInt(tmp);
- for(int i=0;i<combo.getItemCount();i++){
- if (combo.getItemAt(i).equals(tmp)){
- isaddItem=false;
- break;
- }
- }
- if (isaddItem){
- combo.insertItemAt(tmp,0);//插入项目tmp到0索引位置(第一列中).
- }
- font=new Font("SansSerif",Font.PLAIN,fontsize);
- label.setFont(font);
- }catch(NumberFormatException ne){
- combo.getEditor().setItem("你输入的值不是整数值,请重新输入!");
- }
- }
- public void itemStateChanged(ItemEvent e){//ItemListener界面只有itemStateChanged()一个方法,在此实作它。
- if (e.getStateChange()==ItemEvent.SELECTED){//当用户的选择改变时,则在JLabel上会显示出Swing目前字形大小信息.
- int fontsize=0;
- try{
- fontsize=Integer.parseInt((String)e.getItem());
- label.setText("Swing 目前字形大小:"+fontsize);
- }catch(NumberFormatException ne){//若所输入的值不是整数,则不作任何的操作.
- }
- }
- }
- }
Swing JComboBox的使用的更多相关文章
- Java Swing 编程 JComboBox 显示不全问题。
最近在做Java Swing编程一个小例子.然后遇到JComboBox 宽度固定,而下拉列表比较长,导致显示不全的问题. 解决的思路想到两种,1:下拉列表当显示不全的时候,换行显示.2:在下拉列表停几 ...
- Java——下拉列表框:JComboBox
import java.awt.Container; import java.awt.GridLayout; import java.awt.event.WindowAdapter; import j ...
- java的JCombobox实现中国省市区三级联动
源代码下载:点击下载源代码 用xml存储中国各大城市的数据. xml数据太多了就不贴上了,贴个图片: 要解释xml,添加了一个jdom.jar,上面的源代码下载里面有. 解释xml的类: packag ...
- Java Swing 绝对布局管理方法,null布局(转)
首先把相关容器的布局方式设为 setLayout(null); 然后调用组件的 setBounds() 方法 设置button的位置为(100,100) 长宽分别为 60,25 jButton.se ...
- JComboBox
package swing.combox; import java.awt.FlowLayout; import javax.swing.DefaultComboBoxModel; import ja ...
- Swing开发界面时的一个bug复盘
问题:QA突然发个截图说一个Dialog上展示的东西变形了 分析:不理解,什么也没做,怎么会变形,刚刚我用的时候还正常.看看代码,的确什么也没更改:在本地测一下,也没有问题:baidu,bing,st ...
- Swing学习篇 API之JButton组件
按钮(Jbutton) Swing中的按钮是Jbutton,它是javax.swing.AbstracButton类的子类,swing中的按钮可以显示图像,并且可以将按钮设置为窗口的默认图标,而且还可 ...
- Java核心技术卷一基础知识-第9章-Swing用户界面组件-读书笔记
第9章 Swing用户界面组件 本章内容: * Swing与模型-视图-控制器设计模式 * 布局管理概述 * 文本输入 * 选择组件 * 菜单 * 复杂的布局管理 * 对话框 本章将介绍构造功能更加齐 ...
- Java swing 代码例子
package com; import java.awt.Button; import java.awt.Container; import java.awt.event.ActionEvent; i ...
随机推荐
- 由获取子元素的方法find和children所获
html代码如下 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://ww ...
- NIPS 2016论文:英特尔中国研究院在神经网络压缩算法上的最新成果
NIPS 2016论文:英特尔中国研究院在神经网络压缩算法上的最新成果 http://www.leiphone.com/news/201609/OzDFhW8CX4YWt369.html 英特尔中国研 ...
- ICE第三篇------一些疑难点
1 间接代理 参考http://blog.sina.com.cn/s/blog_53e8499c0100lkoo.html IceGrid用于支持分布式网络服务应用,一个IceGrid域由一个注册表( ...
- [Unity]Unity开发NGUI代码实现ScrollView(放大视图)
Unity开发NGUI代码实现ScrollView(放大视图) 下载NGUI包 导入NGUI3.9.1版本package 创建MainCameraScript.cs脚本 MainCameraScrip ...
- iOS 的三种自建证书方法https请求相关配置
如果你的app服务端安装的是SLL颁发的CA,可以使用系统方法直接实现信任SSL证书,关于Apple对SSL证书的要求请参考:苹果官方文档CertKeyTrustProgGuide 这种方式不需要在B ...
- 《数据结构与算法分析:C语言描述》读书笔记------List的C语言实现
List的简单实现.在GCC下测试通过. list.h #ifndef _List_H /*List数据结构的简单实现*/ struct Node; typedef struct Node Node; ...
- 小偷网站工具--Teleport Ultra
可以克隆别人网站的工具 http://jingyan.baidu.com/article/219f4bf7dce58bde442d3836.html
- displayport
去年买了一张ATI的显卡,但是很坑爹的是显卡后面没有VGA接口,除了一个HDMI,另外两个接口不认识,后来认识了DVI,用DVI连接显示器,剩下一个接口是什么一直没管,前两天电脑清灰,感兴趣了,去查了 ...
- Eclipse上Spring-tool的安装
三种安装方式: 插件地址:http://spring.io/tools/sts/all 1.在线安装 Help-->> Install new Software 2.本地安装,Help- ...
- 编译Uboot时提示error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory
在Ubuntu14.04 64位系统中已经安装了libc6:i386的库,编译Uboot时提示error while loading shared libraries: libz.so.1: cann ...