類層次結構圖:
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);
/*
將3個RadioButton對象放進ButtonGroup中,表示此3個RadioButton同一時間只有一個RadioButton的狀態可以爲"on";
*/
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 9@9 ");
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);
}
});
}
}