java課件 第10章01 GUI程序設(shè)計與Applet(共十套)_第1頁
java課件 第10章01 GUI程序設(shè)計與Applet(共十套)_第2頁
java課件 第10章01 GUI程序設(shè)計與Applet(共十套)_第3頁
java課件 第10章01 GUI程序設(shè)計與Applet(共十套)_第4頁
java課件 第10章01 GUI程序設(shè)計與Applet(共十套)_第5頁
已閱讀5頁,還剩56頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第10章GUI程序設(shè)計與Applet(一)主要內(nèi)容10.1GUI程序設(shè)計簡介10.2基于Swing的界面設(shè)計10.3界面布局10.4Swing常用組件10.5Java的事件處理機制10.6鍵盤事件、鼠標(biāo)事件處理GUI程序可以帶給用戶一種更直觀、友好的界面;提供了用戶一種更友好的交互方式,用戶可以通過鼠標(biāo)點擊、拖動、鍵盤控制等更靈活的方式進行應(yīng)用操作。

10.1GUI程序設(shè)計簡介GUI包和簡單GUI程序1.java.awt包Java語言在java.awt包中提供了大量地進行GUI設(shè)計所使用的類和接口,包括繪制圖形、設(shè)置字體和顏色、控制組件、處理事件等內(nèi)容,AWT是Java語言進行GUI程序設(shè)計的基礎(chǔ)。2.javax.swing包Swing包是Java基礎(chǔ)類庫(JavaFoundationClasses,JFC)的一部分。Swing提供了從按鈕到可分拆面板和表格的所有組件。Swing組件是Java提供的第二代GUI設(shè)計工具包,它以AWT為基礎(chǔ),在AWT內(nèi)容的基礎(chǔ)上新增或改進了一些GUI組件,使得GUI程序功能更強大,設(shè)計更容易、更方便。AWT組件和對應(yīng)的Swing組件,從名稱上很容易記憶和區(qū)別。例如,AWT的框架類、面板類、按鈕類和菜單類,被命名為Frame、Panel、Button和Menu,而Swing對應(yīng)的組件類被命名為JFrame、JPanel、JButton和JMenu。與AWT組件相比,Swing組件的名前多一個“J”。另外,AWT組件在java.awt包中,而Swing組件在javax.swing包中。GUI包和簡單GUI程序一個簡單的圖形用戶界面

在Java中,頂層窗口稱為框架。在AWT庫中,對應(yīng)于框架的類是Frame,在Swing庫中,相應(yīng)的類是JFrame。JFrame類擴展了Frame類??蚣苁且粋€容器,我們可以在這個容器中放入其他一些圖形用戶界面組件,如按鈕、菜單等,從而組成一個功能完善的程序。

【例】顯示一個空框架importjavax.swing.*;

publicclassFirstFrame{ publicstaticvoidmain(String[]args) {

SimpleFrameframe=newSimpleFrame();

//設(shè)置用戶關(guān)閉框架時的響應(yīng)動作

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//顯示該框架frame.setVisible(true); }}

classSimpleFrameextendsJFrame{ publicSimpleFrame() {

//設(shè)置框架大小

setSize(WIDTH,HEIGHT); } publicstaticfinalintWIDTH=300; publicstaticfinalintHEIGHT=200; }

一個簡單的圖形用戶界面

主要內(nèi)容10.1GUI程序設(shè)計簡介10.2基于Swing的界面設(shè)計10.3界面布局10.4Swing常用組件10.5Java的事件處理機制10.6鍵盤事件、鼠標(biāo)事件處理10.2JFrame的繼承結(jié)構(gòu)

JFrame類的繼承層次圖

java.lang.Object

java.awt.Component

java.awt.Container

java.awt.Window

java.awt.Frame

javax.swing.JFrame

類JFrameJFrame是帶有標(biāo)題、邊界、菜單的頂層windows窗口,JFrame的默認布局為BorderLayout。對JFrame添加組件有兩種方式:

通過add()方法直接添加組件到JFrame使用getContentPane()方法獲得JFrame的內(nèi)容面板,再對其加入組件:frame.getContentPane().add(組件)類JFrame主要方法

getContentPane()返回此窗體的contentPane對象(內(nèi)容面板,組件要添加到此)getJMenuBar()

返回此窗體上設(shè)置的菜單欄。setIconImage(Image

image)設(shè)置要作為此窗口圖標(biāo)顯示的圖像。setJMenuBar(JMenuBar

menubar)設(shè)置此窗體的菜單欄。publicvoidsetBounds(inta,intb,intwidth,intheigth)publicvoidsetSize(intwidth,intheigth)publicvoidsetLocation(intx,inty)publicvoidsetVisible(booleanb)publicvoidsetResizable(booleanb)//是否允許調(diào)大小

類JFrame其它方法

【例】創(chuàng)建一個swing外觀的并居中的窗體importjavax.swing.*;importjava.awt.*;publicclassmainFrameextendsJFrame{publicmainFrame(StringsTitle,intiWidth,intiHeight){Dimensiondim=Toolkit.getDefaultToolkit().getScreenSize();//獲取屏幕尺寸

ImageIconii=newImageIcon("images/middle.gif");setTitle(sTitle);//設(shè)置窗體標(biāo)題

setIconImage(ii.getImage());//設(shè)置窗體的圖標(biāo)

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//設(shè)置關(guān)閉窗體時退出程序

功能增強的的圖形用戶界面

setSize(iWidth,iHeight);//設(shè)置窗體大小

intw=getSize().width;//獲取窗體寬度

inth=getSize().height;//獲取窗體高度

System.out.println("窗體寬:"+w+"窗體高:"+h);intx=(dim.width-w)/2;inty=(dim.height-h)/2;setLocation(x,y);//將窗體移到屏幕中間

setVisible(true);//顯示窗體

}publicstaticvoidmain(String[]args){//JFrame.setDefaultLookAndFeelDecorated(true);//使用最新SWING外觀mainFramemF=newmainFrame("mainFrameDemo",400,300);}}功能增強的的圖形用戶界面

setDefaultCloseOperation()方法的參數(shù)DO_NOTHING_ON_CLOSE:不執(zhí)行任何操作。HIDE_ON_CLOSE:調(diào)用后自動隱藏該窗體。DISPOSE_ON_CLOSE:調(diào)用后自動隱藏并關(guān)閉該窗體。EXIT_ON_CLOSE:使用Systemexit方法退出應(yīng)用程序。除JFrame外的其它頂層容器JDialog:和JFrame類似,只不過JDialog是用來設(shè)計對話框。JApplet:用來設(shè)計可以在嵌入在網(wǎng)頁中的Java小程序。JWindow:不帶修飾的窗體,無最大、最小按鈕和標(biāo)題欄功能增強的的圖形用戶界面

【例】在一個框架窗口中顯示兩個標(biāo)簽和一個按鈕:上面的標(biāo)簽顯示一串固定的文字信息,選擇按鈕后在下面的標(biāo)簽上顯示系統(tǒng)現(xiàn)在的時間。示例程序一個完整的JavaGUI程序(1)引入合適的包和類一般的SwingGUI程序應(yīng)包含三個import語句,分別表示引入awt包、awt.event包和swing包。(2)設(shè)置一個頂層的容器(3)根據(jù)需要,使用缺省的布局管理器或設(shè)置其它的布局管理器(5)定義組件并將它們添加到容器(6)對組件或事件編碼基于Swing的界面設(shè)計流程主要內(nèi)容10.1GUI程序設(shè)計簡介10.2基于Swing的界面設(shè)計10.3界面布局10.4Swing常用組件10.5Java的事件處理機制10.6鍵盤事件、鼠標(biāo)事件處理10.3布局管理器在容器中所有組件的布局(位置和大?。┯刹季止芾砥鱽砜刂?。Java語言中提供了FlowLayout、BorderLayout、GridLayout、CardLayout和GridBagLayout等多種布局管理器。每種容器都有自己缺省的布局管理器,JFrame的缺省布局管理器是BorderLayout,如果不希望使用缺省的布局管理器,則可使用setLayout()方法來改變?nèi)笔〉牟季止芾砥鳌lowLayoutFlowLayout組件的放置規(guī)律是從上到下、從左到右進行放置,如果當(dāng)前行已放置不下該組件,則放置到下一行的最左邊。

FlowLayout布局模式:

setLayout(new

FlowLayout());//默認居中setLayout(newFlowLayout(FlowLayout.RIGHT));//右對齊BorderLayout

BorderLayout布局把界面分成5個區(qū)域:North,South,East,West和Center,每個區(qū)域只能放置一個組件。當(dāng)界面的大小發(fā)生變化時,其變化規(guī)律為:組件的相對位置不變,大小發(fā)生變化。

BorderLayout布局示例public

class

BorderLayoutDemo

extendsJFrame{

publicBorderLayoutDemo(){

super("網(wǎng)格布局");

this.setSize(300,200);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLayout(newBorderLayout());JButtonbtnEast=newJButton("東");JButtonbtnSouth=newJButton("南");JButtonbtnWest=newJButton("西");JButtonbtnNorth=newJButton("北");JButtonbtnCenter=newJButton("中");add(btnEast,BorderLayout.EAST);add(btnCenter,BorderLayout.CENTER);add(btnWest,BorderLayout.WEST);add(btnSouth,BorderLayout.SOUTH);add(btnNorth,BorderLayout.NORTH);}

public

static

voidmain(String[]args){BorderLayoutDemoBorderFrame=newBorderLayoutDemo();BorderFrame.setVisible(true);}}GridLayoutGridLayout布局管理器將整個界面劃分成N行,M列的網(wǎng)格,每個網(wǎng)格的大小相同。布局時,按照組件加入的順序優(yōu)先考慮按行布局,當(dāng)一行布局滿之后再布局下一行Framef=newFrame("GridLayoutDemo");

f.setLayout(newGridLayout(2,3));

//容器平均分成2行3列共6格GridLayout布局模式 publicstaticvoidmain(String[]args) { ch52f=newch52(); ContainercontentPane=f.getContentPane();

contentPane.setLayout(newGridLayout(4,5)); for(inti=1;i<=4;i++) { for(intj=1;j<=5;j++) { contentPane.add(newJButton(i+"行"+j+"列")); } } f.setVisible(true); }}GridBagLayoutGridBagLayout同GridLayout一樣,在容器中以網(wǎng)格形式來管理組件,但GridBagLayout功能要來得強大得多。1、GridBagLayout管理的所有行和列都可以是大小不同的;2、GridLayout把每個組件限制到一個單元格,而GridBagLayout并不這樣:組件在容器中可以占據(jù)任意大小的矩形區(qū)域。GridBagLayout通常由一個專用類來對他布局行為進行約束,該類叫GridBagConstraints。示例CardLayout將容器中的每個組件看作一張卡片。一次只能看到一張卡片,容器則充當(dāng)卡片的堆棧。當(dāng)容器第一次顯示時,第一個添加到CardLayout對象的組件為可見組件。add(Component

comp):添加組件到容器first(Container

parent)翻轉(zhuǎn)到容器的第一張卡片。last(Container

parent)翻轉(zhuǎn)到容器的最后一張卡片。next(Container

parent)翻轉(zhuǎn)到容器的下一張卡片。previous(Container

parent)翻轉(zhuǎn)到前一張卡片。show(Container

parent,String

name)翻轉(zhuǎn)到具有指定name的組件。NULL布局控件指定位置顯示,利用如下方法輸出PublicvoidsetBounds(intx,inty,intwidth,intheight)即自行設(shè)定窗體和控件的大小和位置publicclassch9_54extendsJFrameimplementsActionListener{ JLabell1; JButtonb1; JTextFieldt1,t2,t3; publicch9_54(){ super("布局模式"); setBounds(20,20,500,300);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ContainercontentPane=getContentPane();

contentPane.setLayout(null); b1=newJButton("="); l1=newJLabel("+"); t1=newJTextField(20); t2=newJTextField(20); t3=newJTextField(20); t1.setForeground(Color.red); t1.setBackground(Color.cyan); t1.setBounds(20,100,100,40); contentPane.add(t1); NULL布局示例l1.setBounds(120,100,40,40); contentPane.add(l1); t2.setBounds(160,100,100,40); contentPane.add(t2); b1.setBounds(260,100,80,40); contentPane.add(b1); t3.setBounds(340,100,100,40); contentPane.add(t3); b1.addActionListener(this); setVisible(true); }publicstaticvoidmain(String[]args){ ch9_54f=newch9_54(); }publicvoidactionPerformed(ActionEvente) { //自行實現(xiàn)加法代碼

}}NULL布局示例主要內(nèi)容10.1GUI程序設(shè)計簡介10.2基于Swing的界面設(shè)計10.3界面布局10.4Swing常用組件10.5Java的事件處理機制10.6鍵盤事件、鼠標(biāo)事件處理10.4Swing常用組件(1)頂層容器JFrame、JApplet、JDialog、JWindows(2)JPanel面板容器JPanel是一種添加到其他容器使用的容器組件,可將組件添加到JPanel,然后再將JPanel添加到某個容器。默認是FlowLayout布局管理器有效的利用Panel可以使版面管理更為容易。參見P204例10.7(3)JTabbedPaneJTabbedPane繼承于javax.swing.JComponent,它是一組帶標(biāo)簽的面板,每個面板可以存放組件,因此JTabbedPane是一容器組件。addTab(String

title,Component

component)添加一個由title表示,且沒有圖標(biāo)的component。getSelectedIndex()返回當(dāng)前選擇的此選項卡窗格的索引。10.4Swing常用組件importjava.awt.BorderLayout;importjavax.swing.*;publicclassJtabTest{staticvoidaddIt(JTabbedPanetabbedPane,Stringtext){JLabellabel=newJLabel(text);JButtonbutton=newJButton(text);JPanelpanel=newJPanel();panel.add(label);panel.add(button);tabbedPane.addTab(text,panel);}JTabbedPane使用

publicstaticvoidmain(Stringargs[]){JFramef=newJFrame("JTabbedPaneSample");f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JTabbedPanetabbedPane=newJTabbedPane();addIt(tabbedPane,"TabOne");addIt(tabbedPane,"TabTwo");addIt(tabbedPane,"TabThree");f.add(tabbedPane,BorderLayout.CENTER);f.setSize(300,200);f.setVisible(true);}}(4)其它組件a)JLabelb)JButtonc)JTextFieldd)JTextAreae)JPasswordFieldf)JRadioButtong)JCheckButton

h)JSlider滾動條i)JListJ)JFileChooserk)JScollBarl)JMenuBar,JMenu,JMenuItem,JCheckMeunItem,JRadioMenuItem,JPopupMenum)JOptionPane模式對話框10.4Swing常用組件Swing組件示例程序JFileChooser,JMenuBar案例JCheckBox,JRadioButton案例主要內(nèi)容10.1GUI程序設(shè)計簡介10.2基于Swing的界面設(shè)計10.3界面布局10.4Swing常用組件10.5Java的事件處理機制10.6鍵盤事件、鼠標(biāo)事件處理10.5什么是事件Event(事件)事件,就是發(fā)生在用戶界面上的用戶交互行為所產(chǎn)生的一種效果。EventSource(事件源)產(chǎn)生事件的對象。Eventhandler/Listener(事件處理器)接收事件對象并對其進行處理的方法。圖示說明importjava.awt.*;importjava.awt.event.*;publicclassTestButton{

publicstaticvoidmain(Stringargs[]) {Framef=newFrame("Test");Buttonb=newButton("PressMe!");b.addActionListener(newButtonHandler());f.setLayout(newFlowLayout());f.add(b); f.setSize(200,100);f.setVisible(true);}}事件處理示例classButtonHandlerimplementsActionListener{ publicvoidactionPerformed(ActionEvente) { System.out.println("Actionoccurred"); }}事件處理示例(1)對于某種類型的事件XXXEvent,定義相應(yīng)的事件監(jiān)聽器類,該類需要實現(xiàn)針對特定事件的特定接口XXXListener;例如:ActionEventActionListener(2)事件源中產(chǎn)生事件后,必須注冊相應(yīng)于該類事件的監(jiān)聽器,使用addXXXListener(XXXListener)來注冊監(jiān)聽器。(3)事件發(fā)生后,產(chǎn)生表示特定事件的事件對象,事件對象被傳遞給已經(jīng)注冊的事件監(jiān)聽器,調(diào)用監(jiān)聽器中的特定方法處理事件進行事件處理的一般方法事件體系結(jié)構(gòu)FocusEventAWTEventActionEventAdjustmentEventComponentEventTextEventItemEventContainerEventInputEventWindowEventPaintEventKeyEventMouseEventEventObject事件類與對應(yīng)的監(jiān)聽器接口

事件類型接口名要實現(xiàn)方法ActionEventActionListeneractionPerformed(ActionEvent)ItemEventItemListeneritemStateChanged(ItemEvent)MouseEventMouseMotionListenermouseDragged(MouseEvent)mouseMoved(MouseEvent)MouseEventMouseListenermousePressed(MouseEvent)mouseReleased(MouseEvent)mouseEntered(MouseEvent)mouseExited(MouseEvent)KeyEventKeyListenerkeyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent)FocusEventFocusListenerfocusGained(FocusEvent)focusLost(FocusEvent)AdjustmentEventAdjustmentListeneradjustmentValueChanged(AdjustmentEvent)ComponentEventComponentListenercomponentMoved(ComponentEvent)componentHidden(ComponentEvent)componentResized(ComponentEvent)componentShown(ComponentEvent)事件類與對應(yīng)的監(jiān)聽器接口

WindowEventWindowListenerwindowClosing(WindowEvent)windowOpened(WindowEvent)windowIconified(WindowEvent)WindowDeiconified(WindowEvent)WindowClosed(WindowEvent)WindowActivated(WindowEvent)WindowDeactivated(WindowEvent)ContainerEventContainerListenercomponentAdded(ContainerEvent)ComponentRemoved(ContainerEvent)TextEventTextListenerTextValueChanged(TextEvent)事件類與對應(yīng)的監(jiān)聽器接口

事件處理方式事件處理中最關(guān)鍵的是通過addXXXListener(XXXListener)來注冊監(jiān)聽器,這可以通過三種方式實現(xiàn):(1)利用監(jiān)聽器類實現(xiàn)事件處理先定義監(jiān)聽器類,然后對要求發(fā)生動作的組件再注冊到這個監(jiān)聽器類的對象中publicclass自定義監(jiān)聽類名implements事件監(jiān)聽器(或extends事件適配器){

……publicvoid監(jiān)聽器接口說明的方法1(){……}……publicvoid監(jiān)聽器接口說明的方法n(){……}}publicclass事件發(fā)生類名{…

組件.addXXXListener(new自定義監(jiān)聽類名());//注冊組件到監(jiān)聽器對象

…}示例程序通過監(jiān)聽器類實現(xiàn)事件監(jiān)聽通過implements實現(xiàn)事件監(jiān)聽接口的問題在于:每次必須實現(xiàn)該接口中所有方法,不論是否需要。事件適配器是實現(xiàn)了不同監(jiān)聽接口的類,它最主要的作用,就是可以簡化監(jiān)聽器接口不必要的事件處理。比如,MouseListener接口有5個方法,如果在某應(yīng)用中只需要其中的一個方法,那么就可以定義一個事件適配器來實現(xiàn)這個特定的方法即可。通過事件適配器實現(xiàn)事件監(jiān)聽事件適配器(EventAdapters)事件適配器事件監(jiān)聽器ComponentListenerComponentAdapterContainerListenerContainerAdapterFocusListenerFocusAdapterKeyListenerKeyAdapterMouseListenerMouseAdapterMouseMotionListenerMouseMotionAdapterWindowFocusListenerWindowAdapter(2)利用內(nèi)部類實現(xiàn)事件處理這種方法就是將獨立的監(jiān)聽器類定義成事件發(fā)生類的內(nèi)部類。publicclass外部類{……組件.addXXXListener(new自定義監(jiān)聽類名());…class自定義監(jiān)聽類名extends事件適配器(或implements事件監(jiān)聽器){//定義內(nèi)部監(jiān)聽器類

……publicvoid監(jiān)聽器接口說明的方法1(){……}publicvoid監(jiān)聽器接口說明的方法n(){……}}//結(jié)束內(nèi)部類}}//結(jié)束外部類事件處理方式(3)利用匿名內(nèi)部類實現(xiàn)事件處理組件對象.addXXXListener(new事件監(jiān)聽器(){//定義匿名內(nèi)部類

publicvoid監(jiān)聽器接口說明的方法1(){……}publicvoid監(jiān)聽器接口說明的方法n(){……} });//結(jié)束匿名類定義事件處理方式利用匿名內(nèi)部類實現(xiàn)事件處理示例classMyPanelextendsPanel{

publicMyPanel(){

ButtonbButton=newButton("藍色");

add(bButton);bButton.addMouseListener(newMouseAdapter(){

publicvoidmouseClicked(MouseEventmevent){setBackground(Color.blue);repaint();

}

});}主要內(nèi)容10.1GUI程序設(shè)計簡介10.2基于Swing的界面設(shè)計10.3界面布局10.4Swing常用組件10.5Java的事件處理機制10.6鍵盤事件、鼠標(biāo)事件處理在按下或釋放鍵盤上的一個鍵時,將生成鍵盤事件。keyEvent

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

時將調(diào)用keyListener。如果程序需要處理特殊的鍵,如方向鍵,需要通過調(diào)用keyPressed()方法來處理。鍵盤事件publicvoidkeypressed(keyEventk){intkeyCode=k.getKeyCode();if(keyCode==k.VK_RIGHT&&k.isShiftDown()){...}}檢測用戶是否按下了Shift+右箭頭鍵

鍵盤事件示例classMyPanelextendsPanel{publicMyPanel(){TextFieldtField=newTextField(20);add(tField);

MyKeyAdapterbAction=newMyKeyAdapter();tField.addKeyListener(bAction);}

privateclassMyKeyAdapterext

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論