第05章 圖形用戶界面設(shè)計(jì)與事件處理
·本章學(xué)習(xí)目標(biāo)了解如何創(chuàng)建GUI程序。
掌握使用常見布局管理器構(gòu)建復(fù)雜的布局。
掌握事件類,事件接口和事件適配器。
了解組件的概念及組件的多種子類的用法。
掌握Swing組件的基本用法。
·本章學(xué)習(xí)內(nèi)容
本章的主要內(nèi)容是如何使用Java的組件構(gòu)建圖形用戶界面(GUI),若要正確地設(shè)計(jì)圖形用戶界面,還要涉及到組件的布局與事件處理。本章要學(xué)習(xí)的知識(shí)點(diǎn)包括:
圖形用戶界面組件——AWT組件、Swing組件
容器的概念及用容器類
布局設(shè)計(jì)及幾種常見的布局管理器
GUI的事件處理
5.1 圖形用戶界面設(shè)計(jì)與AWT組件
Windows操作系統(tǒng)中使用的都是圖形用戶界面(GUI),要在Java中實(shí)現(xiàn)GUI,可通過如下過程來創(chuàng)建一個(gè)GUI元素:
(1)創(chuàng)建組件,如復(fù)選框、列表框、標(biāo)簽等;
(2)確定其初始外觀;
(3)確定它應(yīng)占一個(gè)特定位置還是任一缺省位置;
(4)將其添加至屏幕界面。
Java基本類庫(Java Fundation Class, JFC)是Java 2核心API的重要組成部分。它包括四個(gè)部分:Swing組件、Java 2D、拖放API和可訪問性API。
5.1.1 AWT組件
AWT(Abstract Window ToolKit,抽象窗口工具包)是一組用于設(shè)計(jì)GUI的Java庫函數(shù),位于java.awt包中。它包括以下內(nèi)容:
(1)便于用戶輸出的一組豐富的界面組件;
(2)將組件放置到屏幕上適當(dāng)位置的布局管理器;
(3)事件處理模型;
(4)圖形和圖像工具;
(5)和本地平臺(tái)剪貼板操作一起使用的幾個(gè)類。
5.1.2容器、組件和布局
組件是顯示在屏幕上并能和用戶進(jìn)行交互的圖形對(duì)象。例如常見的命令按鈕、列表框、滾動(dòng)條、位圖等都是組件,在使用時(shí)應(yīng)該放在容器中。java.awt包中包含一個(gè)Component類。
容器是用來存放組件的區(qū)域,在容器上可以繪圖和著色。java.awt包中包含一個(gè)Container類。容器是用來存放組件的,而組件的位置擺放就要使用一些部件管理器來完成這個(gè)任務(wù)了。
5.1.3頂級(jí)容器Frame和中間容器Panel
1、窗體(Frame)
Frame窗體是獨(dú)立于Applet和瀏覽器的一個(gè)窗口,可以用作容器或組件。Frame類是Window類的子類,封裝了窗口中通用的一切組件,并且擁有標(biāo)題欄、菜單欄、邊框和調(diào)整大小的角。
Frame類的構(gòu)造方法如下:
Frame() //創(chuàng)建一個(gè)不含標(biāo)題的標(biāo)準(zhǔn)窗口
Frame(String title) //創(chuàng)建標(biāo)題名為title的標(biāo)準(zhǔn)窗口
【例1】使用Frame類創(chuàng)建一個(gè)窗體。
import java.awt.*;
class FrameDemo {
public static void main(String args[ ]){
Frame f = new Frame();
//Frame f = new Frame (“帶邊框的窗體”);
f.setSize(300,200);
f.setVisible(true);
}
}
2、面板(Panel)
Panel是包含在Frame中的一個(gè)區(qū)域,它是可以將許多組件組合起來的一種容器,也可看作是不含標(biāo)題欄、菜單欄及邊框的窗口。Panel是Container類的一個(gè)子類,只是簡(jiǎn)單的實(shí)現(xiàn)了Container類。通過構(gòu)造方法Panel()即可創(chuàng)建面板。
【例2】創(chuàng)建一個(gè)面板。
import java.awt.*;
class PanelTest extends Panel {
public static void main(String args[ ]){
PanelTest p = new PanelTest();
Frame f = new Frame (“正在測(cè)試面板”);
f.add(p);
f.setSize(300,200);
f.setVisible(true);
}
}
5.2 布局管理器
組件在容器中擺放的方式叫做布局。在前面的程序中提及布局問題,實(shí)際是采用了一種默認(rèn)的布局。本節(jié)介紹幾種常用的布局管理器。
5.2.1 FlowLayout布局
FlowLayout布局就是按行布局。組件按照添加的順序從左到右逐個(gè)擺放在容器上,排滿了一行再排下一行。Applet類和Panel類默認(rèn)的布局就是FlowLayout。
創(chuàng)建FlowLayout布局使用的構(gòu)造方法如表5-39所示。
FlowLayout布局的構(gòu)造方法
構(gòu)造方法 |
解釋 |
FlowLayout() |
創(chuàng)建一個(gè)默認(rèn)的FlowLayout布局。具體的做法是以居中的方式,水平和豎直間距為5個(gè)單位 |
FlowLayout(int align) |
用參數(shù)align指定的對(duì)齊方式創(chuàng)建一個(gè)FlowLayout布局,水平和豎直間距為5個(gè)單位。align可取值為以下靜態(tài)常量: static int CENTER 居中 static int LEFT 左對(duì)齊 static int RIGHT 右對(duì)齊 |
FlowLayout(int align, int hgap, int vgap) |
用參數(shù)align指定的對(duì)齊方式,參數(shù)hgap指定的水平間距,參數(shù)vgap指定的豎直間距創(chuàng)建一個(gè)FlowLayout布局 |
5.2.2 GridLayout布局
GridLayout布局即網(wǎng)格布局,是將容器劃分為若干行列的網(wǎng)格,每一個(gè)格中放置一個(gè)組件,通常是從左到右、從上到下逐行放置的,若要改變放置的方向應(yīng)當(dāng)利用ComponentOrientation類來實(shí)現(xiàn)。放置時(shí)每一個(gè)組件的大小都是相同的,如果添加的個(gè)數(shù)少于網(wǎng)格的個(gè)數(shù),就會(huì)產(chǎn)生空白,如果添加的個(gè)數(shù)多于網(wǎng)格的個(gè)數(shù),系統(tǒng)會(huì)自動(dòng)增加列數(shù)以滿足需要。
創(chuàng)建GridLayout布局使用的構(gòu)造方法如表5-39所示。
GridLayout布局的構(gòu)造方法
構(gòu)造方法 |
解釋 |
public GridLayout() |
創(chuàng)建一個(gè)默認(rèn)的GridLayout布局。具體的做法是添加的所有組件都占據(jù)僅有的一行 |
public GridLayout( int rows, int cols) |
用參數(shù)rows指定的行數(shù)和參數(shù)cols指定的列數(shù)創(chuàng)建一個(gè)GridLayout布局。如果兩個(gè)參數(shù)中有一個(gè)為0,則表示這個(gè)參數(shù)是任意個(gè)數(shù)的。但是二者不能同時(shí)為0,那樣會(huì)引起難料的后果 |
public GridLayout( int rows, int cols, int hgap, int vgap ) |
用參數(shù)rows指定的行數(shù)、參數(shù)cols指定的列數(shù)、參數(shù)hgap指定的水平間距和參數(shù)vgap指定的豎直間距創(chuàng)建一個(gè)GridLayout布局 |
【例】GridLayout應(yīng)用。
import java.awt.*;
import java.swing.*;
public class GridEx{
public static void main(String args[]){
JFrame jf = new JFrame(“Grid Example”);
jf.setLayout(new GridLayout(2,2));
jf.add(new JButton(“1”)); jf.add(new JButton(“2”));
jf.add(new JButton(“3”)); jf.add(new JButton(“4”));
jf.setVisible(true);
}
}
5.2.3 GridBagLayout布局
GridBagLayout布局即網(wǎng)格包布局,是在GridLayout布局的基礎(chǔ)上改進(jìn)發(fā)展而來的,只是比GridLayout布局更靈活,使用起來也要復(fù)雜一些。使用GridBagLayout布局涉及到GridBagLayout類和GridBagConstraints類兩個(gè)類。
GridBagLayout類和GridBagConstraints類的構(gòu)造方法和常用成員方法見下頁。
GridBagLayout類的常用方法
構(gòu)造方法 |
解釋 |
|
public GridBagLayout ( ) |
創(chuàng)建一個(gè)GridBagLayout布局 |
|
常用方法 |
解釋 |
|
public void setConstraints(Component comp, GridBagConstraints constraints) |
設(shè)置布局中參數(shù)comp指定的組件的約束條件為constraints |
GridBagLayout類的構(gòu)造方法
構(gòu)造方法 |
解釋 |
public GridBagConstraints () |
創(chuàng)建一個(gè)GridBagLayout布局的約束條件對(duì)象 |
成員變量 |
解釋 |
static int RELATIVE |
指定組件在行或列的方向上與最后一個(gè)組件或剛加入的組件相鄰 |
static int REMAINDER |
指定組件是行或列的方向上的最后一個(gè)組件 |
int fill |
fill成員變量規(guī)定填充方式,具體可取以下常量: GridBagConstraints.NONE 不改變組件的大小,此為默認(rèn)值 GridBagConstraints.HORIZONTAL使組件的寬度變得足夠大以添滿水平方向的間隙,但不改變豎直方向的高度GridBagConstraints.VERTICAL使組件的高度變得足夠大以添滿豎直方向的間隙,但不改變水平方向的寬度GridBagConstraints.BOTH 使組件的寬度和高度都變得足夠大以添滿水平方向和豎直方向的間隙 |
int gridheight |
組件豎直方向上含有的格數(shù) |
int gridwidth |
組件水平方向上含有的格數(shù) |
5.2.4 BorderLayout布局
BorderLayout布局稱為邊界布局。具體的布局方法是把容器劃分成北north、南south、東east、西west、中center 共5個(gè)區(qū)域,向容器添加組件時(shí)用參數(shù)指明添加到哪個(gè)區(qū)域。如果某一個(gè)區(qū)域沒有添加組件,相鄰的組件將占據(jù)這一區(qū)域的位置,例如若北部沒有分配組件,則東、西、中部中的組件將向上延伸,占據(jù)北部的位置;若東、西部沒有分配組件則中部組件將向兩側(cè)延伸占據(jù)東、西部的位置。
BorderLayout布局的構(gòu)造方法
構(gòu)造方法 |
解釋 |
public BorderLayout() |
創(chuàng)建一個(gè)默認(rèn)的BorderLayout布局,默認(rèn)的水平間距和豎直間距都是0,即各個(gè)組件是彼此緊密相鄰的 |
public BorderLayout (int hgap, int vgap) |
用參數(shù)hgap指定的水平間距和參數(shù)vgap指定的豎直間距創(chuàng)建一個(gè)BorderLayout布局 |
5.2.5 CardLayout布局
CardLayout布局稱為卡片布局,它可以存儲(chǔ)不同的布局,每個(gè)布局就像一個(gè)卡片組中的一張卡片,每次總會(huì)有一張卡片在頂層。卡片通常為一個(gè)Panel對(duì)象。
實(shí)現(xiàn)CardLayout布局的步驟如下:
定義面板,為各面板設(shè)置不同的布局;
panelOne.setLayout(new FlowLayout());
panelTwo.setLayout(new GridLayout(2,1));
將主面板設(shè)置為CardLayout;
panelMain.setLayout(new CardLayout());
將各面板添加至主面板。
panelMain.add(“面板1”,panelOne);
panelMain.add(“面板2”,panelTwo);
5.2.6 null布局
null布局就是沒有布局,用戶可以充分利用Component類的setBounds方法自行布局,靈活性很大。
setBounds(int x, int y, int width, int height):移動(dòng)組件并調(diào)整其大小。
5.3 Swing組件體系結(jié)構(gòu)
由于AWT提供的GUI組件太有限且比較粗糙,開發(fā)大型的應(yīng)用程序時(shí)不能滿足要求,同時(shí)效率比較低。
Swing有一個(gè)與平臺(tái)無關(guān)的實(shí)現(xiàn),Swing是AWT的擴(kuò)展,它提供了許多新的圖形界面組件。Swing組件以"J"開頭,除了有與AWT類似的按鈕(JButton)、標(biāo)簽(JLabel)、復(fù)選框(JCheckBox)、菜單(JMenu)等基本組件外,還增加了一個(gè)豐富的高層組件集合,如表格(JTable)、樹(JTree)。可以說Swing很大程度上取代了AWT來完成GUI的創(chuàng)建。下面詳細(xì)介紹Swing應(yīng)用程序中常用的各種組件的用法。
5.3.1窗體JFrame
JFrame用于在Swing程序中創(chuàng)建窗體,它擴(kuò)展了java.awt.Frame類。JFrame類的構(gòu)造方法如下:
JFrame(); JFrame(String title);
在JFrame中添加組件的步驟:
先調(diào)用Container類的getContentPane()方法來產(chǎn)生一個(gè)Container對(duì)象;
然后使用Container對(duì)象的add()方法來添加組件。
【例3】在Swing組件中創(chuàng)建一個(gè)窗體窗口。
import java.awt.*;
import javax.swing.*;
public class FrameDemo extends JFrame {
public FrameDemo(String title) {
super(title);
}
public static void main(String args[ ]) {
FrameDemo fd = new FrameDemo(“JFrame 測(cè)試”);
fd.setVisible(true);
fd.setSize(300,200);
}
}
5.3.2面板JPanel
JPanel組件是中間容器,用于將輕量級(jí)組件組合在一起,JPanel對(duì)象的默認(rèn)布局為FlowLayout。其構(gòu)造方法如下:
JPanel(); JPanel(LayoutManager lm);
JPanel類的大部分方法都是派生自其父類:JComponent,Container和Component。
【例4】在Swing組件中加入一個(gè)JPanel窗口。
import java.awt.*;
import javax.swing.*;
public class PanelDemo extends JFrame {
public PanelDemo(String title) {
super(title);
Container c = getContentPane();
JPanel cpane = new JPanel();
JButton ok = new JButton(“確定”);
cpane.add(ok);
JButton cancel = new JButton(“取消”);
cpane.add(cancel);
c.add(cpane,BorderLayout.SOUTH);
}
public static void main(String args[ ]) {
PanelDemo pd = new PanelDemo(“JPanel測(cè)試”);
pd.setVisible(true);
pd.setSize(300,200);
}
}
5.3.3標(biāo)簽JLabel
JLabel類是JComponent類的子類,它既可以顯示文本,也可以顯示圖像。其構(gòu)造方法如下:
JLabel(); JLabel(Icon icon);icon表示使用的圖標(biāo)。
JLabel(String text,Icon icon, int align);text表示使用的字符串;icon表示使用的圖標(biāo);align表示水平對(duì)齊方式,其值可以是LEFT、RIGHT和CENTER。
【例5】在Swing組件中加入一個(gè)JLabel標(biāo)簽。
import java.awt.*;
import javax.swing.*;
public class PanelDemo extends JFrame {
public PanelDemo(String title) {
super(title);
Container c = getContentPane();
JPanel cpane = new JPanel();
JLabel my_label = new JLabel();
my_label.setText(“標(biāo)簽測(cè)試”);
cpane.add(my_label);
c.add(cpane,BorderLayout.SOUTH);
}
}
5.3 Swing組件體系結(jié)構(gòu)
public static void main(String args[ ]) {
PanelDemo pd = new PanelDemo(“標(biāo)簽測(cè)試”);
pd.setVisible(true);
pd.setSize(300,200);
}
}
5.3.4按鈕JButton
JButton派生自javax.swing.AbstractButton類,JButton類允許用圖標(biāo),字符串或兩者同時(shí)構(gòu)造一個(gè)按鈕。其構(gòu)造方法如下:
JButton(); JButton(Icon icon);
JButton(String text,Icon icon);
Icon表示使用的圖標(biāo),text表示使用的字符串。按鈕上的文本可包含一個(gè)帶下劃線的字母,表明此按鈕的鍵盤快捷鍵。
【例6】JButton的用法。
import java.awt.*;
import javax.swing.*;
public class ButtonDemo extends JPanel {
JButton b1,b2;
public ButtonDemo() {
b1 = new JButton(“firstButton”);
b2 = new JButton(“secondButton”);
add(b1);
add(b2);
}
public static void main(String args[ ]) {
JFrame jf = new JFrame(“按鈕測(cè)試!”);
jf.getContentPane().add(new ButtonDemo());
jf.setSize(300,200);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE);
}
}
5.3.5文本組件
文本組件對(duì)GUI很重要,JTextComponent是所有Swing文本組件的根類。它包含JTextField組件、JTextArea組件、jPasswordField組件等。
1、JTextField——允許輸入或編輯單行文本。構(gòu)造函數(shù)如下:
JTextField();
JTextField(Document doc, String text,int columns);
JTextField(int columns);
JTextField(String text);
JTextField(String text,int columns);
【例7】創(chuàng)建一個(gè)單行文本。
import java.awt.*;
import javax.swing.*;
public class TextFieldDemo extends JFrame {
public TextFieldDemo() {
Container con = getContentPane();
con.setLayout(new FlowLayout());
JLabel jl = new JLabel(“文本域”);
con.add(jl);
setSize(300,200);
setVisable(true);
}
public static void main(String args[ ]) {
new TextFieldDemo();
}
}
2、JTextArea——用于接收來自用戶的多行文本。它本身不處理滾動(dòng),但可以實(shí)現(xiàn)滾動(dòng)界面,此界面允許被置于JScrollpane內(nèi)部,并據(jù)此實(shí)現(xiàn)滾動(dòng)。其構(gòu)造方法如下:
JTextArea();
JTextArea(Document doc);
JTextArea(Document doc,String text,int rows,int cols);
JTextArea(int rows,int cols);
JTextArea(String text);
JTextArea(String text,int rows,int cols);
【例8】JTextArea對(duì)象的用法。
import java.awt.*;
import javax.swing.*;
public class TextAreaDemo extends JFrame {
public TextAreaDemo() {
Container con = getContentPane();
con.setLayout(new FlowLayout());
JLabel jl = new JLabel(“文本區(qū)”);
con.add(jl);
JTextArea ta = new JTextArea(5,10);
con.add(ta);
setSize(300,200);
setVisable(true);
}
public static void main(String args[ ]) {
new TextAreaDemo();
}
}
5.3.6復(fù)選框JCheckBox
JCheckBox是可以打開或關(guān)閉它以選擇某個(gè)選項(xiàng)的組件,用在Swing中創(chuàng)建復(fù)選框。其構(gòu)造方法如下:
JCheckBox();
JCheckBox(Icon icon);
JCheckBox(Icon icon , Boolean selected);
JCheckBox(String text);
JCheckBox(String text , Boolean selected);
JCheckBox(String text,Icon icon);
JCheckBox(String text,Icon icon , Boolean selected);
5.3.6復(fù)選框JCheckBox
【例9】JCheckBox的用法。
5.3.7單選按鈕JRadioButton
一組單選按鈕用于顯示多個(gè)選項(xiàng),但用戶只能選擇其中一個(gè)。ButtonGroup用于在Swing中創(chuàng)建這樣的組。其構(gòu)造方法如下:
JRadioButton(); JRadioButton(Icon icon);
JRadioButton(Icon icon , Boolean selected);
JRadioButton(String text); JRadioButton(String text , Boolean selected);
JRadioButton(String text,Icon icon); JRadioButton(Action a);
JRadioButton(String text,Icon icon , Boolean selected);
【例10】 JRadioButton的用法。
import java.awt.*;
import javax.swing.*;
public class JRadioButtonDemo extends JFrame {
public JRadioButtonDemo() {
Container con = getContentPane();
con.setLayout(new FlowLayout());
JRadioButton jrb1 = new JRadioButton(“男”);
JRadioButton jrb2 = new JRadioButton(“女”);
ButtonGroup bg = new ButtonGroup();
con.add(new JLable(“性別”));
con.add(jrb1);
con.add(jrb2);
bg.add(jrb1);
bg.add(jrb2);
setSize(300,200);
setVisible(true);
}
public static void main(String args[ ]) {
new JRadioButtonDemo();
}
}
5.3.8列表JList
Swing提供了一個(gè)非常復(fù)雜的列表組件JList,編程時(shí)可以使用字符串列表,也可以使用任意對(duì)象構(gòu)成的列表。其構(gòu)造方法如下:
public JList(); 使用空模型構(gòu)造Jlist
public JList(ListModel dataModel); 構(gòu)造一個(gè)模型,讓它顯示制定模型中的元素
public JList(Object[ ] listData); 構(gòu)造一個(gè)列表以顯示指定數(shù)組listData中的元素
【例10】JList的用法。
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
class AllStars extends JFrame implements ListSelectionListener {
String stars[ ] = {"成龍","劉德華","趙薇","劉若英","周華健"};
JList moviestars = new JList(stars);
JLabel lblask = new JLabel("您最喜歡哪位演員?");
JTextField jt = new JTextField(30);
public AllStars(String s) {
super(s);
JPanel p = (JPanel)getContentPane();
p.setLayout(new BorderLayout());
p.add("North",lblask);
moviestars.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
moviestars.setSelectedIndex(0);
moviestars.addListSelectionListener(this);
moviestars.setBackground(Color.lightGray);
moviestars.setForeground(Color.black);
p.setBackground(Color.white);
p.setForeground(Color.black);
p.add("Center",new JScrollPane(moviestars));
p.add("South",jt);
pack();
}
public static void main(String args[ ]) {
AllStars s = new AllStars("群星璀璨!");
s.setSize(400,400);
s.show();
}
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting() == false) {
if (moviestars.getSelectedIndex() != -1) {
jt.setText((String)moviestars.getSelectedValue());
}
}
}
}
JList不支持滾動(dòng)。為創(chuàng)建滾動(dòng)列表,JList以JScorllPane實(shí)現(xiàn)。實(shí)現(xiàn)代碼如下:
JScorllPane myScorllPane = new JScorllPane();
myScorllPane.getViewport().setView(dataList);
或者
JScorllPane myScorllPane = new JScorllPane(dataList);
JList不提供處理鼠標(biāo)雙擊或三擊的特殊支持,但是使用MouseListener很容易就可以處理這些事件。locationToIndex()方法用于確定單擊的單元。
5.3.9其他Swing組件
比較重要的Swing組件還有表格JTable、滾動(dòng)條JScrollBar、樹JTree和菜單組件等等。其功能及使用方法與前面介紹的Swing組件基本類似,而且我們的NetBeans開發(fā)環(huán)境可以實(shí)現(xiàn)手動(dòng)拖放組件,所以這里就不再具體介紹這些組件。
5.4 事件處理Event
5.4.1事件類AWTEvent
Java使用的是基于授權(quán)事件模型的事件處理方法,即一個(gè)源產(chǎn)生一個(gè)事件并把它送到一個(gè)或多個(gè)監(jiān)聽器,監(jiān)聽器只需等待,直到收到一個(gè)事件,監(jiān)聽器將處理這些事件,然后返回。
Java通過ActionEvent、WindowEvent等事件類處理事件。這些類的父類都是java.awt包中的AWTEvent類。AWTEvent類的層次結(jié)構(gòu)。
java.lang.Object包 |
|||||
Java.untl.EventObject類 |
|||||
AWTEvent事件類 |
|||||
ActionEvent按鈕單擊事件 |
|||||
ComponentEvent組件事件 |
|||||
ContainerEvent容器事件 |
|||||
FocusEvent焦點(diǎn)事件 |
|||||
InputEvent輸入事件 |
|||||
KeyEvent鍵盤事件 |
|||||
MouseEvent鼠標(biāo)事件 |
|||||
WindowEvent窗口事件 |
|||||
ItemEvent選擇事件 |
|||||
TextEvent文本框事件 |
對(duì)于每一個(gè)事件,在進(jìn)行相應(yīng)的處理時(shí)必須知道該事件是哪一個(gè)組件產(chǎn)生的,Java的EventObject類提供了getSource方法用于獲取產(chǎn)生事件的組件對(duì)象,而ActionEvent類提供了getActionCommand方法用于獲取產(chǎn)生事件的按鈕的標(biāo)簽,下表是這兩個(gè)方法的語法格式。
事件處理的常用方法
常用方法 |
解釋 |
public Object getSource( ) |
獲取產(chǎn)生事件的組件 |
public String getActionCommand( ) |
獲取按鈕的標(biāo)簽 |
在Java的java.awt.event包中,每個(gè)事件類都有一個(gè)對(duì)應(yīng)的接口,并在接口中定義了若干個(gè)抽象的事件處理方法。若要接受并處理某一個(gè)事件類,必須實(shí)現(xiàn)相應(yīng)的接口,這些接口名都是以Listener為后綴的。
根據(jù)Java對(duì)接口的規(guī)定,實(shí)現(xiàn)接口時(shí)必須重寫接口中的所有抽象方法,如果并不需要某一個(gè)方法,也要為該方法建立一個(gè)方法體為空的方法。
5.4.2事件類的接口interface
事件監(jiān)聽器(事件類) |
方法 |
說明 |
ActionListener單擊事件接口(ActionEvent單擊事件類) |
actionPerformed |
當(dāng)一個(gè)操作事件發(fā)生時(shí)將調(diào)用此方法。 |
AdjustmentListener調(diào)整焦點(diǎn)事件接口(AdjustmentEvent調(diào)整事件類) |
AdjustmentValueChanged |
當(dāng)發(fā)生調(diào)整事件時(shí)將調(diào)用此方法。 |
ComponentListener組件事件接口(ComponementEvent組件事件類) |
componentResized componentMoved componentshown componentHidden |
當(dāng)組件改變大小、移動(dòng)、顯示或隱藏時(shí)分別調(diào)用這些方法。 |
ContainerListener調(diào)整焦點(diǎn)事件接口(ContainerEvent調(diào)整事件類) |
componentAdded componentRemoved |
當(dāng)將組件添加到容器時(shí)將調(diào)用上一方法,將組件從容器中刪除時(shí)將調(diào)用下一方法。 |
FocusListener調(diào)整焦點(diǎn)事件接口(FocusEvent調(diào)整事件類) |
FocusGained FocusLost |
當(dāng)組件獲得鍵盤焦點(diǎn)時(shí)將調(diào)用上一方法,將組件失去鍵盤焦點(diǎn)時(shí)將調(diào)用下一方法。 |
ItemListener選擇事件接口(ItemEvent選擇事件類) |
itemStateChanged |
當(dāng)單擊復(fù)選框或列表項(xiàng),或項(xiàng)目狀態(tài)改變時(shí)調(diào)用此方法 |
KeyListener鍵盤事件接口 (KeyEvent鍵盤事件類) |
keyPressed keyReleased keyTyped |
當(dāng)按下、釋放按鍵時(shí)分別調(diào)用前兩個(gè)方法;而輸入字符時(shí)將調(diào)用第三個(gè)方法 |
MouseListener鼠標(biāo)按鈕事件接口(MouseEvent鼠標(biāo)事件類) |
mouseClicked mouseEntered mouseExited mousePressed mouseReleased |
當(dāng)按下并立即釋放鼠標(biāo)時(shí)將調(diào)用第一個(gè)方法;鼠標(biāo)進(jìn)入、離開組件時(shí)將分別調(diào)用第二、三個(gè)方法;當(dāng)按下、釋放鼠標(biāo)時(shí)分別調(diào)用地四、五個(gè)方法 |
MouseMotionListener鼠標(biāo)移動(dòng)事件接口(MouseEvent鼠標(biāo)事件類) |
mouseDragged mouseMoved |
當(dāng)拖動(dòng)或移動(dòng)鼠標(biāo)時(shí) |
TextListener文本框事件接口(TextEvent文本框事件類) |
textValueChanged |
文本行或文本區(qū)中中的文本別修改時(shí)將調(diào)用此方法 |
WindowListener窗口事件接口(WindowEvent窗口事件類) |
windowOpened windowActivated windowDeactivated windowClosing windowClosed windowIconified windowDeiconified windowStateChanged |
當(dāng)一個(gè)窗口被打開、激活、禁止、正在關(guān)閉、關(guān)閉、最小化、恢復(fù)、窗口狀態(tài)變化時(shí)依次調(diào)用這些方法 |
實(shí)現(xiàn)接口時(shí)必須重寫接口中的所有方法,這給編程帶來了不便。為此Java提供了事件適配器。事件適配器是一種特殊的類,都具有Adapter后綴,適配器實(shí)現(xiàn)了接口的所有方法,這樣在創(chuàng)建新類時(shí)就可以不實(shí)現(xiàn)接口,而是轉(zhuǎn)而繼承相應(yīng)的適配器,繼承適配器以后,只需重寫用戶用到的方法。下表是接口與適配器的對(duì)應(yīng)關(guān)系。
5.4.3事件適配器Adapter
事件接口 |
事件適配器 |
ComponentListener組件事件接口 |
ComponentAdapter組件事件適配器 |
ContainerListener容器事件接口 |
ContainerAdapter容器事件適配器 |
FocusListener焦點(diǎn)事件接口 |
FocusAdapter焦點(diǎn)事件適配器 |
KeyListener鍵盤事件接口 |
KeyAdapter鍵盤事件適配器 |
MouseListener鼠標(biāo)按鈕事件接口 |
MouseAdapter鼠標(biāo)按鈕事件適配器 |
MouseMotionListener鼠標(biāo)移動(dòng)事件接口 |
MouseMotionAdapter鼠標(biāo)移動(dòng)事件適配器 |
WindowListener窗口事件接口 |
WindowAdapter窗口事件適配器 |
·小結(jié)
由于用戶界面設(shè)計(jì)在程序設(shè)計(jì)中的重要地位,決定了本章內(nèi)容的重要性。在本章中的重點(diǎn)是:組件類及其子類(按鈕組件、文本組件、標(biāo)簽組件、復(fù)選框和單選鈕組、選擇框和列表框、滾動(dòng)條等);事件類及其針對(duì)具體事件的子類,事件接口和事件適配器;容器類及其子類(框架類、面板類、對(duì)話框類等);布局類及其子類;顏色類和字體類;下拉菜單和彈出式菜單。posted on 2010-03-19 10:52 libifeng 閱讀(1190) 評(píng)論(0) 編輯 收藏 所屬分類: Java課件