zoukankan      html  css  js  c++  java
  • JComBox的用法

    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组件。
    7-4-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);
        }
        });
    }
    }
    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()方法。
    7-4-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.

    7-4-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();
        }
    }


    7-4-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){//若所输入的值不是整数,则不作任何的操作.
      
       }
       }
       }
    }

  • 相关阅读:
    那些离不开的 Chrome 扩展插件
    Spring Boot 实战 —— 入门
    Maven 学习笔记
    Linux lvm 分区知识笔记
    Linux 双向 SSH 免密登录
    CentOS Yum 源搭建
    Ubuntu 系统学习
    iOS 测试三方 KIF 的那些事
    Swift 网络请求数据与解析
    iOS Plist 文件的 增 删 改
  • 原文地址:https://www.cnblogs.com/hcw110/p/9028677.html
Copyright © 2011-2022 走看看