天天看點

JAVA元件大全 複選框、選項按鈕、清單方框、下拉式清單的使用與介紹

7-1:使用JCheckBox元件:

類層次結構圖:

  java.lang.Object

    --java.awt.Component

     --java.awt.Container

       --javax.swing.JComponent

          --javax.swing.AbstractButton

            --javax.swing.JToggleButton

              --javax.swing.JCheckBox

   JCheckBox與JRadioButton為JToggleButton的子類,是以它們可以使用AbstractButton抽象類裡面許多好用的方法,如addItemLi

stener()、setText()、isSelected()等等。

構造函數:

   JCheckBox():建立一個新的JChcekBox.

   JCheckBox(Icon icon):建立一個有圖像但沒有文字的JCheckBox.

   JCheckBox(Icon icon,boolean selected):建立一個有圖像但沒有文字的JCheckBox,且設定其初始狀态(有無被選取)。  

   JCheckBox(String text):建立一個有文字的JCheckBox.

   JCheckBox(String text,boolean selected):建立一個有文字的JCheckBox,且設定其初始狀态(有無被選取)。

   JCheckBox(String text,Icon icon):建立一個有文字且有圖像的JCheckBox,初始狀态為無被選取。

   JCheckBox(String text,Icon icon,boolean selected):建立一個有文字且有圖像的JCheckBox,且設定其初始狀态(有無被選取

                                                      )。

7-1-1:構造JCheckBox元件:

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class JCheckBox1{

  public static void main(String[] args){

     JFrame f=new JFrame("JCheckBox1");

     Container contentPane=f.getContentPane();

     contentPane.setLayout(new GridLayout(2,1));

     JPanel p1=new JPanel();

     p1.setLayout(new GridLayout(1,3));

     p1.setBorder(BorderFactory.createTitledBorder("你最喜歡哪一家快餐店呢?"));

     JCheckBox c1=new JCheckBox("麥當勞");

     JCheckBox c2=new JCheckBox("肯德基");

     JCheckBox c3=new JCheckBox("21世紀");

     p1.add(c1);

     p1.add(c2);

     p1.add(c3);

     JPanel p2=new JPanel();

     p2.setLayout(new GridLayout(2,1));

     p2.setBorder(BorderFactory.createTitledBorder("以下為JCheckBox的圖形示範:"));

     JCheckBox c4=new JCheckBox("圖形1",new ImageIcon(".//icons//x.jpg"));

     JCheckBox c5=new JCheckBox("圖形2",new ImageIcon(".//icons//x.jpg"));

     p2.add(c4);

     p2.add(c5);

     contentPane.add(p1);

     contentPane.add(p2);

     f.pack();

     f.show();

       f.addWindowListener(new WindowAdapter(){

           public void windowClosing(WindowEvent e){

              System.exit(0);

           }

       });

  }

}

7-1-2:JCheckBox事件處理:

     你可以在上面的選項中勾選你喜歡吃的快餐店,在勾選的過程中,你可以發現它是可以複選的。但在圖形選項中,我們并無法

清楚使用者是否選擇此項目,因為選或不選圖形都一樣。為解決這個問題,我們要使用到事件處理方法。當JCheckBox中的選項被選取

或取消時,它會觸發ItemEvent的事件,ItemEvent這個類共提供了4種方法可以使用,分别是getItem()、getItemSelectable()、

getStateChange()、paramString()。getItem()與paramString()方法會傳回一些這個JCheckBox的狀态值。一般我們較少用到這兩

個方法。

    getItemSelectable()相當于getSource()方法,一樣都是傳回觸發事件的元件,用來判斷是那個元件産生事件。在上一章中我

們曾經說過,getSource()方法是EventObject類所提供,而所有事件類都會繼承這個類,是以所有的事件我們均能用getSource()

方法來判斷到底是哪個元件觸發了事件。

   最後getStateChange()方法會傳回此元件到底有沒有被選取。這個方法會傳回一個整數值。而我們可以用ItemEvent所提供的類

變量;若被選取則傳回SELECTED,若沒有被選取則傳回DESELECTED.

   下面這個範例我們即利用ItemListener來選取圖形産生變化,ItemListener這個inteface隻有定義一個方法,那就是

itemStateChange(ItemEvent e),是以我們隻需實作這個方法.

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class JCheckBox2 implements ItemListener

{

    JFrame f = null;

    JCheckBox c4 = null;

    JCheckBox c5 = null;

    JCheckBox2(){

        f = new JFrame("JCheckBox");

        Container contentPane = f.getContentPane();

        contentPane.setLayout(new GridLayout(2,1));

        JPanel p1 = new JPanel();

        p1.setLayout(new GridLayout(1,3));

        p1.setBorder(BorderFactory.createTitledBorder("您最喜歡哪一家速食店呢?"));

        JCheckBox c1 = new JCheckBox("麥當勞");

        JCheckBox c2 = new JCheckBox("肯德雞");

        JCheckBox c3 = new JCheckBox("21世紀");

        p1.add(c1);

        p1.add(c2);

        p1.add(c3);

        JPanel p2 = new JPanel();

        p2.setLayout(new GridLayout(2,1));

        p2.setBorder(BorderFactory.createTitledBorder("您喜歡哪種程式語言,喜歡的請打勾:"));

        c4 = new JCheckBox("JAVA",new ImageIcon(".//icons//x.jpg"));

        c5 = new JCheckBox("C++",new ImageIcon(".//icons//x.jpg"));

        c4.addItemListener(this);

        c5.addItemListener(this);

        p2.add(c4);

        p2.add(c5);

        contentPane.add(p1);

        contentPane.add(p2);

        f.pack();

        f.show();

        f.addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent e) {

                    System.exit(0);

            }

        });

    }

    public void itemStateChanged(ItemEvent e)

    {

        if (e.getStateChange() == e.SELECTED)

        {

            if(e.getSource() == c4)

                c4.setIcon(new ImageIcon(".//icons//r.jpg"));

            if(e.getSource() == c5)

                c5.setIcon(new ImageIcon(".//icons//r.jpg"));

        }

        else

        {

            if(e.getSource() == c4)

                c4.setIcon(new ImageIcon(".//icons//x.jpg"));

            if(e.getSource() == c5)

                c5.setIcon(new ImageIcon(".//icons//x.jpg"));

        }

    }

    public static void main(String args[])

    {

        new JCheckBox2();

    }

}

7-2:JRadioButton的使用:

   java.lang.Object

    --java.awt.Component

      --java.awt.Container

       --javax.swing.JComponent

        --javax.swing.Abstractbutton

         --javax.swing.JToggleButton

            --javax.swing.JRadioButton

   JRadioButtonBN J JToggleButton的一個了類,是以它也可以使用AbstractButton抽象類裡的方法。如同前面所述,JChexkBox

主要用在多重選擇時機,而JRadioButton則是運用在單一選擇時機。

  JRadioButton構造函數:

   JRadioButton():建立一個新的JRadioButton.

   JRadioButton(Icon icon):建立一個有圖像但沒有文字的JRadioButton.

   JRadioButton(Icon icon,boolean selected):建立一個有圖像但沒有文字的JRadioButton,且設定其初始狀态(有無被選取).  

   JRadioButton(String text):建立一個有文字的JRadioButton.

   JRadioButton(String text,boolean selected):建立一個有文字的JRadioButton,且設定其初始狀态(有無被選取)。

   JRadioButton(String text,Icon icon):建立一個有文字且有圖像的JRadioButton,初始狀态為無被選取。

   JRadioButton(String text,Icon icon,boolean selected):建立一個有文字且有圖像的JRadioButton,且設定其初始狀态(有無

                                                   被選取。

7-2-1:構造JRadioButton元件與事件處理:

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class JRadioButton1 implements ItemListener

{

    JFrame f = null;

    JRadioButton r4 = null;

    JRadioButton r5 = null;

    JRadioButton1(){

        f = new JFrame("JRadioButton");

        Container contentPane = f.getContentPane();

        contentPane.setLayout(new GridLayout(2,1));

        JPanel p1 = new JPanel();

        p1.setLayout(new GridLayout(1,3));

        p1.setBorder(BorderFactory.createTitledBorder("您最喜歡哪一家速食店呢?"));

        JRadioButton r1 = new JRadioButton("麥當勞");

        JRadioButton r2 = new JRadioButton("肯德雞");

        JRadioButton r3 = new JRadioButton("21世紀");

        p1.add(r1);

        p1.add(r2);

        p1.add(r3);

        JPanel p2 = new JPanel();

        p2.setLayout(new GridLayout(2,1));

        p2.setBorder(BorderFactory.createTitledBorder("您喜歡哪種程式語言? 喜歡的請打勾"));

        r4 = new JRadioButton("JAVA",new ImageIcon(".//icons//x.jpg"));

        r5 = new JRadioButton("C++",new ImageIcon(".//icons//x.jpg"));

        r4.addItemListener(this);

        r5.addItemListener(this);

        p2.add(r4);

        p2.add(r5);

        contentPane.add(p1);

        contentPane.add(p2);

        f.pack();

        f.show();

        f.addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent e) {

                    System.exit(0);

            }

        });

    }

    public void itemStateChanged(ItemEvent e)

    {

        if (e.getStateChange() == e.SELECTED)

        {

            if(e.getSource() == r4)

                r4.setIcon(new ImageIcon(".//icons//r.jpg"));

            if(e.getSource() == r5)

                r5.setIcon(new ImageIcon(".//icons//r.jpg"));

        }

        else

        {

            if(e.getSource() == r4)

                r4.setIcon(new ImageIcon(".//icons//x.jpg"));

            if(e.getSource() == r5)

                r5.setIcon(new ImageIcon(".//icons//x.jpg"));

        }

    }

    public static void main(String args[])

    {

        new JRadioButton1();

    }

}

   要将RadioButton改成單選,我們必須用到ButtonGroup這個類。這個類位于javax.swing這個package下面,ButtonGroup類的主

要功能是:同一時間内隻會有一個元件的狀态為"on",其他皆為"off",也就是同一時間隻有一個元件會被選取。而ButtonGroup類可

被AbstractButton下面的子類所使用,最常被使用的就是JRadioButton、JradioButtonMenu、Item與JToggleButton這些元件。

下面是ButtonGroup的類層次結構圖:

ButtonGroup的類層次結構圖:

java.lang.Object

   --javax.swing.ButtonGroup

   我們更改上例,使RadioButton變成單選吧!

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class JRadioButton2 implements ItemListener{

  JFrame f=null;

  JRadioButton r4=null;

  JRadioButton r5=null;

  JRadioButton2(){

    f=new JFrame("JRadioButton2");

    Container contentPane=f.getContentPane();

    contentPane.setLayout(new GridLayout(2,1));

    JPanel p1=new JPanel();

    p1.setLayout(new GridLayout(1,3));

    p1.setBorder(BorderFactory.createTitledBorder("你最喜歡哪一家快餐店呢?"));

    JRadioButton r1=new JRadioButton("麥當勞");

    JRadioButton r2=new JRadioButton("肯德基");

    JRadioButton r3=new JRadioButton("21世紀");

    p1.add(r1);

    p1.add(r2);

    p1.add(r3);

    ButtonGroup bgroup1=new ButtonGroup();

    bgroup1.add(r1);                         

    bgroup1.add(r2);                         

    bgroup1.add(r3);

    JPanel p2=new JPanel();

    p2.setLayout(new GridLayout(2,1));

    p2.setBorder(BorderFactory.createTitledBorder("你最喜歡哪種程式語言,喜歡的請打勾:"));                       

    r4=new JRadioButton("java",new ImageIcon(".//icons//x.jpg"));

    r5=new JRadioButton("c++",new ImageIcon(".//icons//x.jpg"));

    r4.addItemListener(this);

    r5.addItemListener(this);

    p2.add(r4);

    p2.add(r5);

    ButtonGroup bgroup2=new ButtonGroup();

    bgroup2.add(r4);

    bgroup2.add(r5);

    contentPane.add(p1);

    contentPane.add(p2);

    f.pack();

    f.show();

    f.addWindowListener(new WindowAdapter(){

        public void windowClosing(WindowEvent e){

        System.exit(0);

        }      

    });   

  }

  public void itemStateChanged(ItemEvent e){

    if (e.getStateChange()==e.SELECTED){

      if (e.getSource()==r4)

         r4.setIcon(new ImageIcon(".//icons//r.jpg"));

      if (e.getSource()==r5)

         r5.setIcon(new ImageIcon(".//icons//r.jpg"));

    }else{

      if (e.getSource()==r4)

         r4.setIcon(new ImageIcon(".//icons//x.jpg"));

      if (e.getSource()==r5)

         r5.setIcon(new ImageIcon(".//icons//x.jpg"));

    }

  }

  public static void main(String[] args){

    new JRadioButton2();

  }

}

7-3:JList的使用:

類層次結構圖:

   java.lang.Object

     --java.awt.Component

      --java.awt.Container

       --javax.swing.JComponent

        --javax.swing.JList

    JList與JCheckBox有點相似,都可以讓你選擇一到多個選項,較不同的是,JList的選項方式是整列選取。我們先來看看JList

所提供的構造函數,友善迅速建立JList對象,如下所示:

JList構造函數:

JList():建立一個新的JList元件。

JList(ListModel dataModel):利用ListModel建立一個新的JList元件.

JList(Object[] listData):利用Array對象建立一個新的JList元件。

JList(Vector listData):利用Vector對象建立一個新的JList元件。

7-3-1:建立一般的JList:

一般我們若不需要在JList中加入Icon圖像,通常會用第3或第4個構造函數建立JList對象。而這兩個最大的不同在于使用Array對

象建立JList元件就無法改變項目的數量。對于項目數量經常改變的環境來說,以Vector對象來建立JList元件當然比較适合。例如

一個賣手機的店家,可能動不動就會有新手機上市,此時若用Array對象就不是很适當了!

我們來看個範例看怎麼構造一個簡單的JList吧!

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.util.Vector;

public class JList1

{

    public static void main(String args[])

    {

        JFrame f = new JFrame("JList");

        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 V3688x");

        v.addElement("Panasonic GD92");

        v.addElement("其他");

        JList list1 = new JList(s);

        list1.setBorder(BorderFactory.createTitledBorder("您最喜歡到哪個國家玩呢?"));

        JList list2 = new JList(v);

        list2.setBorder(BorderFactory.createTitledBorder("您最喜歡哪一種手機?"));

        contentPane.add(new JScrollPane(list1));

        contentPane.add(new JScrollPane(list2));

        f.pack();

        f.show();

        f.addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent e) {

                    System.exit(0);

            }

        });

    }

}

  在這個範例中,當視窗變小時,JList并不會有滾動(ScrollBar)的效果,是以可能無法看到比較下面的選項。若我們要有滾動的

效果,必須将JList放入滾動面版中(JScrollPane),如我們在程式改為:

       contentPane.add(new JScrollPane(list1));

       contentPane.add(new JScrollPane(list2));

  如此就有滾動的效果了,若我們要有多個選項呢?在JList中有3種選擇模式(Selection Mode)可供我們使用,分别是單一選擇、

連續區間選擇、與多重選擇。我們可以在ListSelectionModel這個interface中找到這3個常數值,如下:

    static int SINGLE_SELECTION:一次隻能選擇一個項目。

    static int SINGLE_INTERVAL_SELECTION:按住[shift]鍵,可以對某一邊續的項目作選取。

    static int MULTIPLE_INTERVAL_SELECTION:沒有任何限制。可作單一選擇,連續區間選擇,或對不連續的項目作多重選擇(按

住[Ctrl]鍵)。多得選擇是java對JList的預設值,是以在上例中你可以在JList中作這3種模式的選擇方式。

    設定選擇模式可以利用JList所提供的setSelectionMode(int selectionMode)方法。例如,若我們将上例改成如下:

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.util.Vector;

public class JList2

{

    public static void main(String args[])

    {

        JFrame f = new JFrame("JList");

        Container contentPane = f.getContentPane();

        contentPane.setLayout(new GridLayout(1,3));

        String[] s1 = {"美國","日本","大陸","英國","法國","意大利","澳洲","南韓"};

        String[] s2 = {"範志毅","符兵","周甯","楊晨","高鋒","南方","其他"};

        Vector v = new Vector();

        v.addElement("Nokia 3310");

        v.addElement("Nokia 8850");

        v.addElement("Nokia 8250");

        v.addElement("Motorola V8088");

        v.addElement("Motorola V3688x");

        v.addElement("Panasonic GD92");

        v.addElement("Panasonic GD93");

        v.addElement("NEC DB2100");

        v.addElement("Alcatel OT500");

        v.addElement("Philips Xenium [email protected] ");

        v.addElement("Ericsson T29sc");

        v.addElement("其他");

        JList list1 = new JList(s1);

        list1.setBorder(BorderFactory.createTitledBorder("您最喜歡到哪個國家玩呢?"));

        JList list2 = new JList(s2);

        list2.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        list2.setBorder(BorderFactory.createTitledBorder("您最喜歡哪個運動員呢?"));

        JList list3 = new JList(v);

        list3.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);

        list3.setBorder(BorderFactory.createTitledBorder("您最喜歡哪一種手機?"));

        contentPane.add(new JScrollPane(list1));

        contentPane.add(new JScrollPane(list2));

        contentPane.add(new JScrollPane(list3));

        f.pack();

        f.show();

        f.addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent e) {

                    System.exit(0);

            }

        });

    }

}

7-3-2:利用ListModel構造JList:

  ListModel是一個interface,主要的功能是定義一些方法,讓JList或JComboBox這些元件取得每個項目的值,并可限定項目的顯示

時機與方式,下面為ListModel這個interface所定義的方法:

   ListModel interface定義的方法:

    void                    addListDataListener(ListDataListener l):當data model的長度或内容值有任何改變時,利用此

                            方法就可以處理ListDataListener的事件。data model是vector或array的資料類型,裡面存放List

                            中的值。

    Object                  getElementAt(int index):傳回在index位置的Item值。

    int                     getSize():傳回List的長度。

    void                    removeListDataListener(ListDataListener l):删除ListDataListener.

  還記得我們一開始在介紹JList時所提到的構造函數嗎?其中有一個JList的構造函數是這樣的:

      JList(ListModel dataModel)

  是以我們必須實作ListModel所有的方法,才能利用上面這個構造函數建立JList.不過要實作ListModel所有的方法有點麻煩,因

為一般我們不會用到addListDataListener()與removeListDataListener()這兩個方法。是以java提供了AbstractListModel這個抽

象類,此抽象類實作了addListDataListener()與removeListDataListener()這兩個方法。若我們繼承AbstractListModel,就不需

實作這兩個方法,隻需要實作getElementAt()與getSize()方法即可,我們來看下面的範例:

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class JList3{

  public JList3(){

     JFrame f=new JFrame("JList");

     Container contentPane=f.getContentPane();

     ListModel mode=new DataModel();

     JList list=new JList(mode);//利用ListModel建立一個JList.

     list.setVisibleRowCount(5);//設定程式一打開時所能看到的資料項個數。

     list.setBorder(BorderFactory.createTitledBorder("你最喜歡到哪個國家玩呢?"));

     contentPane.add(new JScrollPane(list));

     f.pack();

     f.show();

     f.addWindowListener(new WindowAdapter(){

     public void windowClosing(WindowEvent e){

        System.exit(0);

     }

     });

  }

  public static void main(String[] args){

  new JList3();

  }

}

class DataModel extends AbstractListModel{

  String[] s={"美國","越南","大陸","英國","法國","大陸","意大利","澳洲"};

  public Object getElementAt(int index){//getxElementAt()方法中的參數index,系統會自動由0開始計算,不過要自己作累加

                                        //的操作.

     return (index+1)+"."+s[index++];

  }

  public int getSize(){

  return s.length;

  }

}

  事實上,java本身還提供另一個類,DefaultListModel實體類。此類繼承了AbstractListModel抽象類,并實作裡面所有的抽象方

法,是以你不需要再自行實作任何的方法,可以說是相當的友善。不過既然所有的抽象都已經被實作,是以在設計的彈性上就會有

有所降低。若你是喜歡自行管理JList項目的設計者,你可以不要使用DefaultListModel這個類,隻需要在AbstractListModel上多

下功夫即可。

  下面的例子我們改寫上面的例子,直接使用DefaultListModel類:

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.util.Vector;

public class JList4

{

    public JList4()

    {

        JFrame f = new JFrame("JList");

        Container contentPane = f.getContentPane();

        ListModel mode = new DataModel();

        JList list = new JList(mode);

        list.setVisibleRowCount(5);

        list.setBorder(BorderFactory.createTitledBorder("您最喜歡到哪個國家玩呢?"));

        contentPane.add(new JScrollPane(list));

        f.pack();

        f.show();

        f.addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent e) {

                    System.exit(0);

            }

        });

    }

    public static void main(String args[])

    {

        new JList4();

    }

}

class DataModel extends DefaultListModel

{

    String[] s = {"美國"," 日本","大陸","英國","法國","意大利","澳洲","南韓"};

    DataModel()

    {

        for(int i=0; i < s.length; i++)

            addElement((i+1)+"."+s[i]);

    }

}

  程式運作結果與上個範例相同。

  好奇怪,這不是跟我們使用Vector方式,利用JList(Vector v)構造函數來建立新的JList一樣嗎?如同JList1.java中的例子,為

什麼還要多此一舉呢?其實若讀者去檢視DefaultListModel類,可發現此類提供不少好用的方法,例如你可以随意的增加一個項目(

addElement())、或是删除一個項目(removeElement)、甚至你可以很友善地做到查詢(getElementAt())與彙出(copyInto())項目的

操作。你可以發現,利用DefaultListModel可以直接動态地更改JList的項目值,而不需要自行産生一個Vecotr對象;相對于JList(

Vector v)這個構造函數,可說更友善且實用許多.

  至于利用ListModel或AbstractListModel來構造JList有什麼好處?讀者隻要這麼想,ListModel中文就是“列出模式”,那麼每

個老師都會有自己開課的學生成績,老師應該可以看到每個同學的成績,而深長應該隻能看到自己的成績,是以我們就會有兩種不

同的“列出模式”。我們隻需要去改寫getElementAt()方法,就會有不同的列出模式産生,如下面的範例:

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.util.Vector;

public class JList5

{

    public JList5()

    {

        JFrame f = new JFrame("JList");

        Container contentPane = f.getContentPane();

        contentPane.setLayout(new GridLayout(1,2));

        ListModel mode = new DataModel(1);

        JList list1 = new JList(mode);

        list1.setVisibleRowCount(5);

        list1.setBorder(BorderFactory.createTitledBorder("您玩過哪些軟體?"));

        mode = new DataModel(2);

        JList list2 = new JList(mode);

        list2.setBorder(BorderFactory.createTitledBorder("您玩過哪些資料庫軟體?"));

        contentPane.add(new JScrollPane(list1));

        contentPane.add(new JScrollPane(list2));

        f.pack();

        f.show();

        f.addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent e) {

                    System.exit(0);

            }

        });

    }

    public static void main(String args[])

    {

        new JList5();

    }

}

class DataModel extends AbstractListModel

{

    String[] s = {"MS SQL","MySQL","IBM DB2","ORACLE","Windows 2000","Linux","UNix","OS2"};

    int flag;

    DataModel(int flag)

    {

        this.flag = flag;

    }

    public Object getElementAt(int index)

    {

        String tmp = null;

        if (flag == 1)

            tmp = (index+1)+"."+s[index++];

        if (flag == 2)

        {

            if(index < 4)

                tmp = (index+1)+"."+s[index++];    

        }

        return tmp;

    }

    public int getSize()

    {

        return s.length;

    }

}

7-3-3:建立有圖像的JList:

  我們也可以在JList中加入Icon圖像,不過JList加入圖像比較麻煩一點,不像JLabel或JButton那樣簡單。要在JList上加入Icon,

要先了解ListCellRenderer interface.我們必須由這個interface所定義的方法,将圖像畫在JList中的每個項目。

ListCellRenderer interface裡隻定義了一個方法,那就是getListCellRendererComponent,不過這個參數有點多,我們把它列出來

看看:

public Component getListCellRendererComponent(JList list,

                                              Object value,

                                              int index,

                                              boolean isSelected,

                                              boolean cellHasFocus)

list:即所要畫上的圖像的JList元件。

value:JList項目值,如list.getModel().getElementAt(index)所傳回的值。

index:為JList項目的索引值,由0開始。

isSelected與cellHasFocus:判斷JList中的項目是否有被選取或是有焦點置入。

  上面這4個參數會在你設定JList的繪圖樣式(setCellRenderer())時自動的由JList元件提供,你隻要關心怎麼控制

getListCellRendererComponent()方法中的4個參數,而無需擔心怎麼參數傳入。

   要在JList中加入Icon圖像的技巧就是将JList中的每一個項目當作是JLabel,因為JLabel在使用文字與圖像上非常的友善,要設定

JList的圖像,必須使用setCellRenderer(ListCellRenderer cellRenderer)這個方法。我們來看下面這個範例,你就能明白了!

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.util.Vector;

public class JList6

{

    public JList6()

    {

        String[] s = {"西瓜","蘋果","草莓","香蕉","葡萄"};

        JFrame f = new JFrame("JList");

        Container contentPane = f.getContentPane();

        JList list1 = new JList(s);

        list1.setBorder(BorderFactory.createTitledBorder("您喜歡吃哪些水果?"));

        list1.setCellRenderer(new CellRenderer());

        contentPane.add(new JScrollPane(list1));

        f.pack();

        f.show();

        f.addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent e) {

                    System.exit(0);

            }

        });

    }

    public static void main(String args[])

    {

        new JList6();

    }

}

class CellRenderer extends JLabel implements ListCellRenderer

{

    CellRenderer()

    {

        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;

    }   

}

7-3-4:JList的事件處理:

   JList的事件處理一般可分為兩種:一種是取得使用者選取的項目;另一種是在JList的項目上輕按兩下滑鼠兩次,運作相對應的工作。我

們先來看第一種事件處理方式:

    在JList類中有addListSelectionListener()方法,可以檢測使用者是否對JList的選取有任何的改變。ListSelectionListener

interface中隻有定義一個方法,那就是valueChanged(ListSelectionEvent e),我們必須實作這個方法,才能在使用者改變選取值時

取得使用者最後的選取狀态。我們來看一下的例子: 這個例子勻們抓取使用者所選取的項目,并将所選的項目顯示在JLabel上。

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.event.*;//由于ListSelectionEvent是swing的事件,不是awt的事件,是以我們必須import

                            //javax.swing.event.*。

public class JList7 implements ListSelectionListener

{

    JList list = null;

    JLabel label = null;

    String[] s = {"美國","日本","大陸","英國","法國","意大利","澳洲","南韓"};

    public JList7()

    {

        JFrame f = new JFrame("JList");

        Container contentPane = f.getContentPane();

        contentPane.setLayout(new BorderLayout());

        label = new JLabel();

        list = new JList(s);

        list.setVisibleRowCount(5);

        list.setBorder(BorderFactory.createTitledBorder("您最喜歡到哪個國家玩呢?"));

        list.addListSelectionListener(this);

        contentPane.add(label,BorderLayout.NORTH);

        contentPane.add(new JScrollPane(list),BorderLayout.CENTER);

        f.pack();

        f.show();

        f.addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent e) {

                    System.exit(0);

            }

        });

    }

    public static void main(String args[])

    {

        new JList7();

    }

    public void valueChanged(ListSelectionEvent e)

    {

        int tmp = 0;

        String stmp = "您目前選取:";

        int[] index = list.getSelectedIndices();//利用JList類所提供的getSelectedIndices()方法可得到使用者所選取的所有

        for(int i=0; i < index.length ; i++)//index值,這些index值由一個int array傳回.

        {

            tmp = index[i];

            stmp = stmp+s[tmp]+"  ";

        }

        label.setText(stmp);

    }

}

   接下來,我們來看如何處理在JList上輕按兩下滑鼠的操作。由于JList本身并無提供這樣的EventListener,是以我們必須利用

MouseListener來達到捕獲輕按兩下滑鼠的事件。至于要怎麼知道我們到底在哪個項目上輕按兩下滑鼠呢?我們可以利用JList類所提供的

LocatToindex()方法得知。以下為我們所舉的範例:

   這個例子一開始左邊列有國這名稱,當你在某個國家名稱上輕按兩下滑鼠,這個國家名稱就會移到右邊去,反之亦同。

   1.這個範例我們應用DefaultListModel類,因主DefaultListModel類實作了Vector中的方法,使我們在處理動态的JList項目值 

     比較容易.

   2.由于我們要處理滑鼠事件,為了編寫友善,在程式中我們繼承MouseAdapte抽象類.

   3.在程式中,我們建立兩個DataModel,第一個JList,也就是list1一開始時會将String Array s中的所有值依次放入list1的項

     目中,而list2一開始為空白。

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.event.*;

public class JList8 extends MouseAdapter{

  JList list1=null;

  JList list2=null;

  DefaultListModel mode1=null;

  DefaultListModel mode2=null;

  String[] s = {"美國","日本","大陸","英國","法國","意大利","澳洲","南韓"};

  public JList8(){

  JFrame f=new JFrame("JList");

  Container contentPane=f.getContentPane();

  contentPane.setLayout(new GridLayout(1,2));

  mode1=new DataModel(1);

  list1=new JList(mode1);

  list1.setBorder(BorderFactory.createTitledBorder("國家名稱!"));

  list1.addMouseListener(this);//一遇到滑鼠事件立即執行.

  mode2=new DataModel(2);

  list2=new JList(mode2);

  list2.setBorder(BorderFactory.createTitledBorder("你最喜歡到哪個國家玩呢!"));

  list2.addMouseListener(this);//一遇到滑鼠事件立即執行.

  contentPane.add(new JScrollPane(list1));

  contentPane.add(new JScrollPane(list2));

   f.pack();

   f.show();

   f.addWindowListener(new WindowAdapter(){

      public void windowClosing(WindowEvent e){

         System.exit(0);

      }

   });   

  }

  public static void main(String[] args){

  new JList8();

  }

//處理滑鼠鍵擊事件.

  public void mouseClicked(MouseEvent e){

  int index;

  if (e.getSource()==list1){

     if (e.getClickCount()==2){

        index=list1.locationToIndex(e.getPoint());

        String tmp=(String)mode1.getElementAt(index);

        mode2 .addElement(tmp);

        list2.setModel(mode2);

        mode1.removeElementAt(index);

        list1.setModel(mode1);

     }

  }

  if (e.getSource()==list2){

     if (e.getClickCount()==2){

        index=list2.locationToIndex(e.getPoint());

        String tmp=(String)mode2.getElementAt(index);

        mode1 .addElement(tmp);

        list1.setModel(mode1);

        mode2.removeElementAt(index);

        list2.setModel(mode2);

     }

  }

  }

  class DataModel extends DefaultListModel{

    DataModel(int flag){

      if (flag==1){

      for (int i=0;i<s.length;i++)  addElement(s[i]);      

      }

    }

  }

}

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

  }

  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){//若所輸入的值不是整數,則不作任何的操作.

       }

     }

   }