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

下載本文檔

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

文檔簡介

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

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

容器–框架8框架是獨立于Applet和瀏覽器的一個窗口??梢酝ㄟ^以下任一構(gòu)造函數(shù)來創(chuàng)建:Frame():創(chuàng)建一個不含標(biāo)題的標(biāo)準(zhǔn)窗口Frame(StringTitle):創(chuàng)建一個含有標(biāo)題的窗口,這個標(biāo)題是由參數(shù)title指定的。當(dāng)一個Frame窗口被創(chuàng)建以后,需要調(diào)用setSize()方法來設(shè)置窗口的大小,并調(diào)用setVisible()來顯示窗口。容器-面板9面板不是一個單獨的窗口,它只是包含在窗口中的一個區(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ù)選框、選擇框等。高級組件包括滾動條、滾動窗格和對話框。向窗口加入一個組件:首先生成所需組件的實例,然后調(diào)用add()方法,此方法是在Container類中定義的。標(biāo)簽12可以通過以下任一構(gòu)造函數(shù)來創(chuàng)建:JLabel():新建一個空標(biāo)簽JLabel(String

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

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

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

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

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

JTextField(Strings,intcolumns):新建一個包含給定字符串和列數(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():新建一個TextAreaJTextArea(introws,intcols):新建一個包含給定行數(shù)和列數(shù)的TextAreaJTextArea(Stringtext,introws,intcols):新建一個包含給定字符串、行數(shù)和列數(shù)的JTextArea要接受輸入多行文本時使用可以包括滾動條...JTextArea

txtComment=newJTextArea();

cp.add(txtComment);

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

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

btnCancel=newJButton("取消!");

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

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

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

或GridBagLayout

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

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

FlowLayout21FlowLayout的構(gòu)造函數(shù)有:FlowLayout():生成一個默認(rèn)的流式布局FlowLayout(intalignment):可以設(shè)定每一行組件的對齊方式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è)定組件間的水平和垂直距離窗口、框架和對話框等的缺省布局組件可被置于容器的北、南、東、西或中間位置BorderLayout2-2

BorderLayout

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

BorderLayout.NORTH–對應(yīng)容器的頂部BorderLayout.EAST–對應(yīng)容器的右部BorderLayout.SOUTH–對應(yīng)容器的底部BorderLayout.WEST–對應(yīng)容器的左部BorderLayout.CENTER–對應(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():生成一個單列的網(wǎng)格布局-GridLayout(int

row,int

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

row,int

col,int

horz,int

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

用于將容器區(qū)域劃分為一個矩形網(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(shù)ridwidth,gridheight:指定組件將占用多少行和多少列weightx,weighty:指定在一個GridBagLayout

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

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

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

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

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

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

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

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

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

GUI組件

MyListener

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

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

}

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

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

通常按下按鈕,雙擊列表項或選中一個菜單項時,就會生成此事件。Button、List、MenuItem、TextField

AdjustmentEvent

操縱滾動條時會生成此事件。ScrollbarComponentEvent

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

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

FocusEvent

組件獲得或失去鍵盤焦點時會生成此事件。ComponentAWT事件類型2-238事件類說明事件源KeyEvent

接收到鍵盤輸入時會生成此事件。ComponentMouseEvent

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

將組件添加至容器或從中刪除時會生成此事件。ContainerTextEvent

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

WindowEvent

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

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

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

有興趣接收事件的任何監(jiān)聽器類都必須實現(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為具有多個方法的監(jiān)聽器接口提供適配器類。適配器類實現(xiàn)并提供了一個事件監(jiān)聽器接口中的所有的方法,但這些方法都是空方法。privateclassMyMouseAdapterextendsMouseAdapter{privateColorbgColor;

publicMyMouseAdapter(Colorc){bgColor=c;}

publicvoidmouseClicked(MouseEvent

mevent){

setBackground(bgColor);repaint();

}}

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

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

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

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

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

ccField.requestFocus();}}實現(xiàn)了當(dāng)捕捉到失去焦點事件時如何響應(yīng)檢驗失去焦點的組件中的文本格式是否正確如果格式不正確,將焦點移回到該組件窗口事件當(dāng)一個窗口被激活、禁止、關(guān)閉、正在關(guān)閉、最小化、恢復(fù)、打開時將生成窗口事件。需要實現(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);}}}實現(xiàn)了windowClosing方法,以響應(yīng)窗口關(guān)閉時的事件

importjava.awt.*;

importjava.awt.event.*;

publicclassMyAdapterDemo{publicstaticvoidmain(String[]args){

MyFrame

frm=newMyFrame();

frm.show();}}48

在按下或釋放鍵盤上的一個鍵時,將生成鍵盤事件。

keyEvent

類包含用來表示按下或點擊的鍵的常量。

生成keyEvent

時將調(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按下鍵時背景變?yōu)樘m色,釋放鍵時背景變?yōu)榧t色,輸入字符x時退出程序50鼠標(biāo)事件任何時候移動、單擊、按下或釋放鼠標(biāo),都會生成鼠標(biāo)事件。鼠標(biāo)事件有兩種監(jiān)聽器:MouseListener

和MouseMotionListener。需要實現(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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論