第九章-圖形用戶界面_第1頁
第九章-圖形用戶界面_第2頁
第九章-圖形用戶界面_第3頁
第九章-圖形用戶界面_第4頁
第九章-圖形用戶界面_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

JAVAGUI第九章目標(biāo)了解AWT包及其組件掌握如何創(chuàng)建GUI程序掌握AWT組件的基本用法掌握如何使用布局管理器構(gòu)造復(fù)雜的布局2JavaGUI編程GUI——GraphicUserInterface的縮寫,圖形用戶界面的意思。前面編寫的程序都是在控制臺(tái)下進(jìn)行的,用戶交互的形式非常單一,GUI程序就是為了創(chuàng)建所見即所得的用戶交互界面而產(chǎn)生。GUI由一些組件組成,這些組件在java中稱為Component,比如所見到的諸如窗口、按鈕、文本框、單選按鈕、多選按鈕等等。GUI設(shè)計(jì)主要包含三方面的工作:創(chuàng)建組件、布局管理和事件處理。3主要圖形控件4抽象窗口工具包圖形用戶界面(GUI)可以通過鍵盤或鼠標(biāo)來響應(yīng)用戶的操作。抽象窗口工具包(AWT)是一組Java類,此組Java類允許創(chuàng)建圖形用戶界面(GUI)。AWT提供用于創(chuàng)建生動(dòng)而高效的GUI的各種組件。5SwingGUI繼承關(guān)系6容器7可以存放組件的區(qū)域,可在容器上進(jìn)行繪制和著色

java.awt包中的Container類可直接或間接派生出兩個(gè)常用容器:框架(Frame類)和面板(Panel類)??蚣苁且粋€(gè)帶有邊框的獨(dú)立的窗口。面板是包含在窗口中的一個(gè)不帶邊框的區(qū)域。

容器–框架8框架是獨(dú)立于Applet和瀏覽器的一個(gè)窗口??梢酝ㄟ^以下任一構(gòu)造函數(shù)來創(chuàng)建:Frame():創(chuàng)建一個(gè)不含標(biāo)題的標(biāo)準(zhǔn)窗口Frame(StringTitle):創(chuàng)建一個(gè)含有標(biāo)題的窗口,這個(gè)標(biāo)題是由參數(shù)title指定的。當(dāng)一個(gè)Frame窗口被創(chuàng)建以后,需要調(diào)用setSize()方法來設(shè)置窗口的大小,并調(diào)用setVisible()來顯示窗口。容器-面板9面板不是一個(gè)單獨(dú)的窗口,它只是包含在窗口中的一個(gè)區(qū)域。面板是可以將許多組件組合起來的一種容器。最簡單的創(chuàng)建面板的方式就是通過面板的構(gòu)造函數(shù)Panel()來進(jìn)行。必須將面板添加到窗體中。使用容器示例importjava.swing.*;Importjava.awt.*;

classPanelTestextendsJPanel{ publicstaticvoidmain(String

args[]){

PanelTestp=newPanelTest();

JFrame

jf=newJFrame("正在測試面板!");

jf.add(p); jf.setSize(300,200);

jf.setVisible(true); } }

10使用GUI組件必須導(dǎo)入該包AWT組件11組件指可以放置在用戶界面上的任何東西,可以將組件設(shè)置為可見或重新調(diào)整其大小。AWT支持的組件:標(biāo)簽、文本域、文本區(qū)、按鈕、復(fù)選框、選擇框等。高級(jí)組件包括滾動(dòng)條、滾動(dòng)窗格和對(duì)話框。向窗口加入一個(gè)組件:首先生成所需組件的實(shí)例,然后調(diào)用add()方法,此方法是在Container類中定義的。標(biāo)簽12可以通過以下任一構(gòu)造函數(shù)來創(chuàng)建:JLabel():新建一個(gè)空標(biāo)簽JLabel(String

labeltext):新建一個(gè)包含給定文本的標(biāo)簽JLabel(String

labeltext,intalignment):新建一個(gè)包含給定對(duì)齊方式的標(biāo)簽,對(duì)齊方式可以為Label.LEFT、Label.RIGHT

或Label.CENTER通常用來指明項(xiàng)目的用途標(biāo)簽不可以被用戶編輯文本域13可以通過以下任一構(gòu)造函數(shù)來創(chuàng)建:JTextField():新建一個(gè)文本域

JTextField(intcolumns):新建一個(gè)包含給定列數(shù)的文本域

JTextField(Strings):新建一個(gè)包含給定字符串的文本域

JTextField(Strings,intcolumns):新建一個(gè)包含給定字符串和列數(shù)的文本域

一種用來輸入文本的GUI組件只能接受一行輸入標(biāo)簽和文本域使用示例importjava.awt.*;

importjavax.swing.*;classTextLabelDemoextendsJFrame{

JLabel

lblName=newJLabel(“名稱:”);

JTextField

txtName=newJTextField(20);

publicTextLabelDemo(Stringtitle){

super(title);Containercp=getContentPane();

cp.setLayout(new

FlowLayout());

cp.add(lblName);

cp.add(txtName);}publicstaticvoidmain(String

args[]){

TextLabelDemot=newTextLabelDemo("正在測試組件!");

t.setSize(300,200); t.setVisible(true);} }

14文本區(qū)15可以通過以下構(gòu)造函數(shù)來創(chuàng)建:JTextArea():新建一個(gè)TextAreaJTextArea(introws,intcols):新建一個(gè)包含給定行數(shù)和列數(shù)的TextAreaJTextArea(Stringtext,introws,intcols):新建一個(gè)包含給定字符串、行數(shù)和列數(shù)的JTextArea要接受輸入多行文本時(shí)使用可以包括滾動(dòng)條...JTextArea

txtComment=newJTextArea();

cp.add(txtComment);

...按鈕16可以使用以下任一構(gòu)造函數(shù)來創(chuàng)建按鈕:JButton():新建一個(gè)空的按鈕JButton(Stringtext):新建一個(gè)包含給定字符串的按鈕按鈕是任何GUI都不可或缺的組件用來捕捉用戶操作的最為簡便的方式...JButton

btnOk=newJButton("確定!");JButton

btnCancel=newJButton("取消!");

cp.add(btnOk);cp.add(btnCancel);

...布局管理器17用戶界面上的組件可以按不同方式排列。Java使用布局管理器來管理這些排列方式。每當(dāng)需要重新調(diào)整屏幕大小或重新繪制屏幕上任一項(xiàng)目時(shí),就要用到布局管理器。AWT提供一組用來進(jìn)行布局管理的類,稱為布局管理器或布局。所有布局都實(shí)現(xiàn)LayoutManager接口。布局類型18Java中的布局類型包括以下幾種:FlowLayout(流式布局)BorderLayout(邊界布局)GridLayout(網(wǎng)格布局)GridBagLayout(網(wǎng)格包布局)CardLayout(卡片布局)布局類型的選用19每個(gè)布局管理器都有自己特定的用途。要按行和列顯示幾個(gè)同樣大小的組件,GridLayout

會(huì)比較合要在盡可能大的空間里顯示一個(gè)組件,就要選擇BorderLayout

或GridBagLayout

如何設(shè)置布局20每個(gè)容器(Container對(duì)象)都有一個(gè)與它相關(guān)的缺省的布局管理器。-Applet的缺省布局是FlowLayout

在沒有設(shè)置新的布局前,在容器中添加組件都按照該容器的缺省布局排列??梢酝ㄟ^setLayout()方法為容器設(shè)置新的布局。

FlowLayout21FlowLayout的構(gòu)造函數(shù)有:FlowLayout():生成一個(gè)默認(rèn)的流式布局FlowLayout(intalignment):可以設(shè)定每一行組件的對(duì)齊方式FlowLayout(int

alignment,int

horz,int

vert):可以設(shè)定組件間的水平和垂直距離Applet和面板的缺省布局組件從左上角開始按從左到右、從上到下的方式排列FlowLayout

mylayout=newFlowLayout();FlowLayout

exLayout=new

FlowLayout(FlowLayout.RIGHT);setLayout(exlayout);//為容器設(shè)置新布局

BorderLayout2-122下面是BorderLayout所定義的構(gòu)造函數(shù):-BorderLayout():生成默認(rèn)的邊界布局-BorderLayout(int

horz,int

vert):可以設(shè)定組件間的水平和垂直距離窗口、框架和對(duì)話框等的缺省布局組件可被置于容器的北、南、東、西或中間位置BorderLayout2-2

BorderLayout

類定義了幾個(gè)常量值以指定相應(yīng)區(qū)域:

BorderLayout.NORTH–對(duì)應(yīng)容器的頂部BorderLayout.EAST–對(duì)應(yīng)容器的右部BorderLayout.SOUTH–對(duì)應(yīng)容器的底部BorderLayout.WEST–對(duì)應(yīng)容器的左部BorderLayout.CENTER–對(duì)應(yīng)容器的中部加入組件方法:

voidadd(Component

Obj,intregion);23...

setLayout(new

BorderLayout());

ButtonbtnEast=newButton("東");

ButtonbtnWest=newButton("西");

ButtonbtnNorth=newButton("北");

ButtonbtnSouth=newButton("南");

ButtonbtnCenter=newButton("中");

add(btnEast,BorderLayout.EAST);

add(btnWest,BorderLayout.WEST);

add(btnNorth,BorderLayout.NORTH);

add(btnSouth,BorderLayout.SOUTH);

add(btnCenter,BorderLayout.CENTER);...GridLayout24GridLayout的構(gòu)造函數(shù)如下所示:

-

GridLayout():生成一個(gè)單列的網(wǎng)格布局-GridLayout(int

row,int

col):生成一個(gè)設(shè)定行數(shù)和列數(shù)的網(wǎng)格布局-GridLayout(int

row,int

col,int

horz,int

vert):可以設(shè)置組件之間的水平和垂直間隔

用于將容器區(qū)域劃分為一個(gè)矩形網(wǎng)格組件按行和列排列...

JButton

btn[];//聲明按鈕數(shù)組

Stringstr[]={"1","2","3","4","5","6","7","8","9"};

setLayout(newGridLayout(3,3));

btn=newJButton[str.length];//創(chuàng)建按鈕數(shù)組

for(inti=0;i<str.length;i++){

btn[i]=newJButton(str[i]);add(btn[i]);}GridBagLayout

25通過使用以下語法容器可獲得GridBagLayout:GridBagLayout

gb=newGridBagLayout();ContainerName.setLayout(gb);要使用此布局,必須提供各組件的大小和布局等信息。GridBagConstraints

類中包含GridBagLayout

類用來定位及調(diào)整組件大小所需的全部信息。組件大小不必相同組件按行和列排列放置順序不一定為從左至右和由上至下GridBagConstraints

類2-126成員變量列表:gridx,gridy:指定組件放置于哪個(gè)單元中g(shù)ridwidth,gridheight:指定組件將占用多少行和多少列weightx,weighty:指定在一個(gè)GridBagLayout

中應(yīng)如何分配空間,這些變量的缺省值為0ipadx,ipady:指定組件的最小高度和寬度GridBagConstraints

類2-227成員變量列表:fill:指定在單元大于組件的情況下,組件如何填充此單元,共有4可選值。缺省值為:GridBagConstraints.NONEanchor:指定將組件放置在單元中的位置,共有9個(gè)可選值。缺省值為:GridBagConstraints.CENTER

GridBagLayoutGBC.fill=GridBagConstraints.BOTH;(按鈕可以在水平和垂直兩個(gè)方向擴(kuò)展)layout.setConstraints(button1,GBC);add(button1);GBC.gridwidth=

GridBagConstraints.RELATIVE;(BOTH依然起作用,緊挨著最后一個(gè)按鈕)28GridBagLayoutlayout.setConstraints(button2,GBC);add(button2);GBC.gridwidth=

GridBagConstraints.REMAINDER;(填充剩余部分)layout.setConstraints(button3,GBC);add(button3);………}29事件模型目標(biāo)事件控制的要點(diǎn)AWT事件結(jié)構(gòu)基本事件控制使用多個(gè)監(jiān)聽器匿名類30事件控制的要點(diǎn)Java最新的事件處理方法是基于授權(quán)事件模型事件源生成事件并將其發(fā)送至一個(gè)或多個(gè)監(jiān)聽器監(jiān)聽器簡單地等待,直到它收到一個(gè)事件。一旦事件被接受,監(jiān)聽器將處理這些事件,然后返回。31事件32在授權(quán)事件模型中,事件是一個(gè)描述事件源狀態(tài)改變的對(duì)象。

通過鼠標(biāo)、鍵盤與GUI界面直接或間接交互都會(huì)生成事件。

如:按下一個(gè)按鈕、通過鍵盤輸入一個(gè)字符、選擇列表框中的一項(xiàng)、點(diǎn)擊一下鼠標(biāo)等。33事件源事件源是一個(gè)生成事件的對(duì)象一個(gè)事件源可能會(huì)生成不同類型的事件事件源提供了一組方法,用于為事件注冊一個(gè)或多個(gè)監(jiān)聽器。每種事件的類型都有其自己的注冊方法。一般形式為:

publicvoidadd<EventType>Listener(TypeListenere)34AWT采取的事件控制過程監(jiān)聽器對(duì)象屬于一個(gè)類的實(shí)例,這個(gè)類實(shí)現(xiàn)了一個(gè)特殊的接口,名為“監(jiān)聽者接口”事件源是一個(gè)對(duì)象,它可以注冊一個(gè)或多個(gè)監(jiān)聽器對(duì)象,并向其發(fā)送事件對(duì)象。事件源將在發(fā)生事件時(shí)向所有注冊的監(jiān)聽器發(fā)送事件對(duì)象。

監(jiān)聽器對(duì)象使用事件對(duì)象中的信息來確定它們對(duì)事件的響應(yīng)。按鈕單擊事件示例publicclassMyEventTestextendsPanel{ButtonmyButton=newButton("藍(lán)色");...//創(chuàng)建面板或其他

GUI組件

MyListener

myAction=newMyListener();MyButton.addActionListener(myAction);

privateclassMyListenerimplementsActionListener{publicMyListener(){...//初始化

}

publicvoidactionPerformed(ActionEventevent){...//需要為事件進(jìn)行的操作}}}35實(shí)現(xiàn)了ActionListener接口的監(jiān)聽器實(shí)現(xiàn)了actionPerformed方法,以便根據(jù)參數(shù)ActionEvent

對(duì)象的信息對(duì)事件做出響應(yīng)為按鈕事件注冊監(jiān)聽器事件體系結(jié)構(gòu)36FocusEventAWTEventActionEventAdjustmentEventComponentEventTextEventItemEventContainerEventInputEventWindowEventPaintEventKeyEventMouseEventEventObjectAWT事件類型2-137事件類說明事件源ActionEvent

通常按下按鈕,雙擊列表項(xiàng)或選中一個(gè)菜單項(xiàng)時(shí),就會(huì)生成此事件。Button、List、MenuItem、TextField

AdjustmentEvent

操縱滾動(dòng)條時(shí)會(huì)生成此事件。ScrollbarComponentEvent

當(dāng)一個(gè)組件移動(dòng)、隱藏、調(diào)整大小或成為可見時(shí)會(huì)生成此事件。ComponentItemEvent

單擊復(fù)選框或列表項(xiàng)時(shí),或者當(dāng)一個(gè)選擇框或一個(gè)可選菜單的項(xiàng)被選擇或取消時(shí)生成此事件。Checkbox、CheckboxMenuItem、Choice、List

FocusEvent

組件獲得或失去鍵盤焦點(diǎn)時(shí)會(huì)生成此事件。ComponentAWT事件類型2-238事件類說明事件源KeyEvent

接收到鍵盤輸入時(shí)會(huì)生成此事件。ComponentMouseEvent

拖動(dòng)、移動(dòng)、單擊、按下或釋放鼠標(biāo)或在鼠標(biāo)進(jìn)入或退出一個(gè)組件時(shí),會(huì)生成此事件。ComponentContainerEvent

將組件添加至容器或從中刪除時(shí)會(huì)生成此事件。ContainerTextEvent

在文本區(qū)或文本域的文本改變時(shí)會(huì)生成此事件。TextField、TextArea

WindowEvent

當(dāng)一個(gè)窗口激活、關(guān)閉、失效、恢復(fù)、最小化、打開或退出時(shí)會(huì)生成此事件。

Window監(jiān)聽器接口39監(jiān)聽器通過實(shí)現(xiàn)java.awt.event

包中定義的一個(gè)或多個(gè)接口來創(chuàng)建。在發(fā)生事件時(shí),事件源將調(diào)用監(jiān)聽器定義的相應(yīng)方法。

有興趣接收事件的任何監(jiān)聽器類都必須實(shí)現(xiàn)監(jiān)聽器接口。

監(jiān)聽器接口列表2-140事件監(jiān)聽器

方法

ActionListener

actionPerformed

AdjustmentListener

adjustmentValueChanged

ComponentListener

componentResizedcomponentMovedcomponentShowncomponentHidden

ContainerListener

componentAddedcomponentRemoved

FocusListener

focusLost、focusGained

ItemListener

itemStateChanged

監(jiān)聽器接口列表2-241事件監(jiān)聽器

方法

KeyListener

keyPressed、keyReleasedkeyTyped

MouseListener

mouseClicked、mouseEnteredmouseExited、mousePressedmouseReleased

MouseMotionListener

mouseDragged、mouseMoved

TextListener

textChanged

WindowListener

windowActivated、windowDeactivated

windowClosed、windowClosingwindowIconified、windowDeiconifiedwindowOpened

適配器類42適配器類

事件監(jiān)聽器接口

ComponentAdapter

ComponentListener

ContainerAdapter

ContainerListener

FocusAdapter

FocusListener

KeyAdapter

KeyListener

MouseAdapter

MouseListener

MouseMotionAdapter

MouseMotionListener

WindowAdapter

WindowListener

為了使事件處理變得簡單,Java為具有多個(gè)方法的監(jiān)聽器接口提供適配器類。適配器類實(shí)現(xiàn)并提供了一個(gè)事件監(jiān)聽器接口中的所有的方法,但這些方法都是空方法。privateclassMyMouseAdapterextendsMouseAdapter{privateColorbgColor;

publicMyMouseAdapter(Colorc){bgColor=c;}

publicvoidmouseClicked(MouseEvent

mevent){

setBackground(bgColor);repaint();

}}

事件源、監(jiān)聽器和監(jiān)聽器接口事件源描述事件對(duì)象中事件的性質(zhì)。每個(gè)事件源都被映射至一個(gè)或多個(gè)事件監(jiān)聽器,發(fā)生事件時(shí)需要調(diào)用這些事件監(jiān)聽器。

事件源隨后通過將事件對(duì)象傳遞至監(jiān)聽器接口類的方法,將事件信息發(fā)送到監(jiān)聽器接口。監(jiān)聽器分析事件對(duì)象找出事件信息,以便給出響應(yīng)。43焦點(diǎn)事件44任何GUI對(duì)象的獲得或失去焦點(diǎn)都被視為焦點(diǎn)事件,并且事件源必須向事件監(jiān)聽器通知事件對(duì)象已失去或已獲得焦點(diǎn)。焦點(diǎn)監(jiān)聽器需要實(shí)現(xiàn)兩個(gè)方法:focusGained

和focusLost。要進(jìn)行錯(cuò)誤檢查或數(shù)據(jù)校驗(yàn)時(shí),對(duì)焦點(diǎn)的捕捉就顯得尤其重要。焦點(diǎn)事件示例45publicvoidfocusLost(FocusEventevent){

if(event.getComponent()==ccField&&!event.isTemporary()){

if(!checkFormat(ccField.getText()))

ccField.requestFocus();}}實(shí)現(xiàn)了當(dāng)捕捉到失去焦點(diǎn)事件時(shí)如何響應(yīng)檢驗(yàn)失去焦點(diǎn)的組件中的文本格式是否正確如果格式不正確,將焦點(diǎn)移回到該組件窗口事件當(dāng)一個(gè)窗口被激活、禁止、關(guān)閉、正在關(guān)閉、最小化、恢復(fù)、打開時(shí)將生成窗口事件。需要實(shí)現(xiàn)的方法如下:windowActivated、windowClosedwindowClosing、windowDeactivatedwindowDeiconified、windowIconifiedwindowOpened46窗口事件示例47classMyFrameextendsFrame{

booleanw;

publicMyFrame(){

w=false;

setTitle("測試適配器類");

setSize(300,200);

MyPanelpanel=newMyPanel();

add(panel);

addWindowListener(new

MyWindowAdapter());}

privateclassMyWindowAdapterextendsWindowAdapter{

publicvoidwindowClosing(WindowEvent

wevent){

if(w)dispose();elseSystem.exit(0);}}}實(shí)現(xiàn)了windowClosing方法,以響應(yīng)窗口關(guān)閉時(shí)的事件

importjava.awt.*;

importjava.awt.event.*;

publicclassMyAdapterDemo{publicstaticvoidmain(String[]args){

MyFrame

frm=newMyFrame();

frm.show();}}48

在按下或釋放鍵盤上的一個(gè)鍵時(shí),將生成鍵盤事件。

keyEvent

類包含用來表示按下或點(diǎn)擊的鍵的常量。

生成keyEvent

時(shí)將調(diào)用keyListener。如果程序需要處理特殊的鍵,如方向鍵,需要通過調(diào)用keyPressed()方法來處理。鍵盤事件publicvoidkeypressed(keyEventk){

int

keyCode=k.getKeyCode();if(keyCode==k.VK_RIGHT&&k.isShiftDown()){...}}檢測用戶是否按下了Shift+右箭頭鍵鍵盤事件示例classMyPanelextendsPanel{publicMyPanel(){

TextField

tField=newTextField(20);

add(tField);

MyKeyAdapter

bAction=newMyKeyAdapter();

tField.addKeyListener(bAction);}

privateclassMyKeyAdapterextendsKeyAdapter{

publicvoidkeyPressed(KeyEvent

kevent){

setBackground(Color.blue);repaint();}

publicvoidkeyReleased(KeyEvent

kevent){

setBackground(Color.red);repaint();}

publicvoidkeyTyped(KeyEvent

kevent){if(kevent.getKeyChar()=='x')System.exit(0);}}}

49按下鍵時(shí)背景變?yōu)樘m色,釋放鍵時(shí)背景變?yōu)榧t色,輸入字符x時(shí)退出程序50鼠標(biāo)事件任何時(shí)候移動(dòng)、單擊、按下或釋放鼠標(biāo),都會(huì)生成鼠標(biāo)事件。鼠標(biāo)事件有兩種監(jiān)聽器:MouseListener

和MouseMotionListener。需要實(shí)現(xiàn)的方法如下:

mouseClicked、mouseEntered、mouseExited

mousePressed、mouseReleased

mouseDragged、mouseMoved

publicvoidmouseClicked(Mou

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論