B11圖形用戶界面設(shè)計(jì)ppt課件(全)_第1頁(yè)
B11圖形用戶界面設(shè)計(jì)ppt課件(全)_第2頁(yè)
B11圖形用戶界面設(shè)計(jì)ppt課件(全)_第3頁(yè)
B11圖形用戶界面設(shè)計(jì)ppt課件(全)_第4頁(yè)
B11圖形用戶界面設(shè)計(jì)ppt課件(全)_第5頁(yè)
已閱讀5頁(yè),還剩99頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第11章 圖形用戶界面設(shè)計(jì)11.1 java AWT和Swing基礎(chǔ)11.2 常用容器11.2 布局管理器11.3 事件處理11.4 常用組件11.1 java AWT和Swing基礎(chǔ)11.1.1 java的AWT和Swing概述11411.1.2 java的AWT組件和Swing組件11411.1.3 利用AWT組件和Swing組件進(jìn)行程序設(shè)計(jì)的基本步驟11611.1.1 java的AWT和Swing概述AWT Abstract Window ToolKit的縮寫(xiě),是抽象窗口組件工具包,是 Java語(yǔ)言中最早的用于編寫(xiě)圖形界面應(yīng)用程序的工具包。該工具包提供了一套與本地圖形界面進(jìn)行交互的接口。

2、AWT組件集遵循最大公約數(shù)原則,即AWT只擁有所有平臺(tái)上都存在的組件的公有集合重量級(jí)組件11.1.1 java的AWT和Swing概述Swing 為了解決 AWT 存在的問(wèn)題而新開(kāi)發(fā)的包。Swing 是在AWT的基礎(chǔ)上構(gòu)建的一套新的圖形界面系統(tǒng),它提供了AWT 所能夠提供的所有功能,并且用純粹的Java代碼對(duì)AWT 的功能進(jìn)行了大幅度的擴(kuò)充。輕量級(jí)組件11.1.2 java的AWT組件和Swing組件1基本概念組件(Component)是構(gòu)成GUI的基本元素,如按鈕、標(biāo)簽、畫(huà)布、復(fù)選框等。容器(Container)組件,簡(jiǎn)稱(chēng)容器,是一個(gè)可以包含組件和其他容器的組件.如,JPanel,JTabb

3、edPane、JScrollPane等。非容器組件(原子組件)則是不可以包含組件和其他容器的組件,如JButton、JLabel、JTextField等。11.1.2 java的AWT組件和Swing組件1基本概念向容器組件中添加組件 panel.add(button); 頂層容器是一個(gè)能夠提供圖形繪制的容器,是進(jìn)行圖形編程的基礎(chǔ),一切圖形化的東西,都必然包括在頂層容器中。JFrame:用來(lái)設(shè)計(jì)類(lèi)似于Windows系統(tǒng)中的窗口形式的應(yīng)用程序。 JDialog:和JFrame類(lèi)似,只不過(guò)JDialog是用來(lái)設(shè)計(jì)對(duì)話框。 JApplet:用來(lái)設(shè)計(jì)可以在嵌入在網(wǎng)頁(yè)中的Java小程序。每一個(gè)窗口應(yīng)用程

4、序中有且只能有一個(gè)頂層容器組件。11.1.2 java的AWT組件和Swing組件1基本概念中間容器屬于容器型組件,可包含組件和其他容器的組件,但自身又必須包含在其他容器(如頂層容器)中,如JPanel,JScrollPane等。特殊容器:在GUI上起特殊作用的中間層,如,JRootPane。不可編輯信息的顯示組件:例如JLabel, JProgressBar等可編輯信息的顯示組件:如, Jtable, JtextArea等11.1.2 java的AWT組件和Swing組件2組件的繼承關(guān)系A(chǔ)WT組件包含在java.awt包里,如Button、Checkbox、Scrollbar等,都是Comp

5、onent類(lèi)的子類(lèi)。Swing中大多數(shù)組件其名稱(chēng)都是在原來(lái)AWT組件名稱(chēng)前加上J,例如JButton、JCheckBox、JScrollbar等,都是JComponent類(lèi)的子類(lèi)。-11.1.3 利用AWT組件和Swing組件進(jìn)行程序設(shè)計(jì)的基本步驟1 引入包2 選擇“外觀和感覺(jué)”3 設(shè)置頂層容器4 設(shè)置布局管理5 向容器中添加組件6 對(duì)組件進(jìn)行事件處理11.1.3 利用AWT組件和Swing組件進(jìn)行程序設(shè)計(jì)的基本步驟1 引入包import javax.swing.*;import java.awt.*;import .*;import .*;import .*;import .*;import

6、 .*;11.1.3 利用AWT組件和Swing組件進(jìn)行程序設(shè)計(jì)的基本步驟2 選擇“外觀和感覺(jué)”在產(chǎn)生任何可視組件以前需設(shè)置好它們的外觀和感覺(jué)。設(shè)置某種外觀和感覺(jué),需要使用UIManager類(lèi)所提供的setLookAndFeel()靜態(tài)方法。通常我們只會(huì)做兩種選擇:java提供的跨平臺(tái)的外觀和感覺(jué)??梢岳肬IManager類(lèi)提供的getCrossPlatformLookAndFeelClassName()靜態(tài)方法獲得類(lèi)名。程序所處系統(tǒng)的外觀和感覺(jué)??梢岳肬IManager類(lèi)提供的getSystemLookAndFeel()靜態(tài)方法獲得目前操作平臺(tái)的Look and Feel類(lèi)名稱(chēng)字符串。1

7、1.1.3 利用AWT組件和Swing組件進(jìn)行程序設(shè)計(jì)的基本步驟3 設(shè)置頂層容器Application程序一般選擇JFrame(或Frame)作為頂層容器(主窗口),Applet程序一般選擇JApplet(或Applet)作為頂層容器(主窗口)。4 設(shè)置布局管理布局管理就是創(chuàng)建這種類(lèi)型的一個(gè)對(duì)象,并采用此對(duì)象來(lái)安排其它容器和基本組件。常用的四種布局管理器:FlowLayout、BorderLayout、CardLayout、GridLayout。5 向容器中添加組件利用方法add()向有關(guān)容器添加組件,容器可以嵌套。6 對(duì)組件進(jìn)行事件處理設(shè)置監(jiān)視器監(jiān)視事件方法,并進(jìn)行相應(yīng)處理。11.2 常用容

8、器11.2.1 框架11.2.2 面板 滾動(dòng)窗口11.2.4 菜單設(shè)計(jì)11.2.5 對(duì)話框11.2.1 框架框架是一種頂層容器,是用來(lái)設(shè)計(jì)類(lèi)似于Windows系統(tǒng)中的窗口形式的應(yīng)用程序。AWT中的Frame類(lèi)和Swing的JFrame類(lèi)是用于建立框架的。JFrame類(lèi)是Frame的子類(lèi)。與AWT組件不同,Swing組件不能直接添加到頂層容器中,它必須添加到一個(gè)與Swing頂層容器相關(guān)聯(lián)的內(nèi)容面板(content pane)上。內(nèi)容面板是頂層容器包含的一個(gè)普通容器,它是一個(gè)輕量級(jí)組件。基本規(guī)則如下:(1)把Swing組件放入一個(gè)頂層Swing容器的內(nèi)容面板上。(2)避免使用非Swing的重量級(jí)組

9、件。11.2.1 框架對(duì)JFrame添加組件有兩種方式:1) 用getContentPane( )方法獲得JFrame的內(nèi)容面板,再對(duì)其加入組件:frame.getContentPane().add(childComponent)2) 建立一個(gè)Jpanel或 JDesktopPane之類(lèi)的中間容器,把組件添加到容器中,用setContentPane()方法把該容器置為JFrame的內(nèi)容面板:Jpanel contentPane=new Jpanel( );/把其它組件添加到Jpanel中;frame.setContentPane(contentPane); /把contentPane對(duì)象設(shè)置成

10、為frame的內(nèi)容面板11.2.1 框架使用JFrame容器進(jìn)行圖形界面程序開(kāi)發(fā)基本步驟:(1)創(chuàng)建的JFrame窗口是不可見(jiàn)的,要使得可見(jiàn),需要使用show()方法或setVisible(Boolean b)方法,其中setVisible中的參數(shù)b=true。(2)使用setSize方法設(shè)置窗口大小。(3)向JFrame中添加組件時(shí),必須先取得ContentPane,然后再使用add()方法把組件加入到ContentPane中,這與AWT包中的Frame直接使用add()方法添加組件不同?!緦?shí)例11-3】import java.awt.*;import javax.swing.*;publi

11、c class JFrameExamplepublic static void main(String args )JFrameExample obj=new JFrameExample ( );obj.myJFrame( );public void myJFrame( )JFrame jframe=new JFrame(一個(gè)框架應(yīng)用);Container panel=jframe.getContentPane( );panel.setLayout(new FlowLayout( );panel.add(new JButton( 歡迎使用JFrame!);jframe.setSize(300,

12、150);jframe.show( ); 11.2.2 面板Java中的JPanel組件屬于容器型組件可以在JPanel中放置按鈕、文本框等非容器組件,甚至還可以在JPanel中再放置若干個(gè)JPanel組件Swing采用JPanel定義面板,面板必須包含在另一個(gè)容器(如JFrame)中?!緦?shí)例11-4】import java.awt.*;import javax.swing.*;public class JpanelExampleprivate void fillJPanel(Container c) Button button1,button2,button3; button1=new Bu

13、tton(確定);button2=new Button(取消);button3=new Button(保存); c.add(button1);c.add(button2);c.add(button3); public static void main(String args)JpanelExample obj=new JpanelExample();obj.myJPanel();【實(shí)例11-4】public void myJPanel()JFrame jframe=new JFrame(一個(gè)面板應(yīng)用);Container contentPane=jframe.getContentPane();

14、contentPane.setLayout(new FlowLayout();JPanel jpanel1=new JPanel();fillJPanel(jpanel1);jpanel1.setBackground(Color.BLUE); jpanel1.setForeground(Color.RED);JPanel jpanel2=new JPanel();fillJPanel(jpanel2);jpanel2.setBackground(Color.WHITE);jpanel2.setForeground(Color.BLACK);contentPane.add(jpanel1);co

15、ntentPane.add(jpanel2); contentPane.add(new JButton(我不在那些面板里!);jframe.setSize(400,250);jframe.show(); 11.2.3 滾動(dòng)窗口JScrollPane類(lèi)用來(lái)建立滾動(dòng)窗口的,是Container(容器)的子類(lèi)。由九個(gè)部分組成,包括一個(gè)中心顯示地帶、四個(gè)角和四條邊右上角右下角左上角左下角圖11.1 JScrollPane容器11.2.3 滾動(dòng)窗口JScrollPane類(lèi)與JPanel的不同是面板中可以添加多個(gè)組件,滾動(dòng)窗口中只能添加一個(gè)組件將組件添加到面板中,然后再把面板添加到滾動(dòng)窗口中。JScrol

16、lPane類(lèi)經(jīng)常和JList、JLabel、JTextArea等類(lèi)配合使用?!緦?shí)例11-5】import java.awt.*;import javax.swing.*;public class myJScrollPanelExamplepublic static void main(String args)JFrame jframe=new JFrame(按鈕面板滾動(dòng)窗口);Container contentPane=jframe.getContentPane();contentPane.setLayout(new FlowLayout();JPanel jpanel=new JPanel(

17、);JScrollPane jscrollpane=new JScrollPane();JButton jbutton1=new JButton(確定);JButton jbutton2=new JButton(取消);JButton jbutton3=new JButton(保存);jpanel.add(jbutton1);jpanel.add(jbutton2);jpanel.add(jbutton3);jscrollpane.setViewportView (jpanel);contentPane.add(jscrollpane);jframe.setSize(800,650);jfra

18、me.show(); 11.2.4 菜單設(shè)計(jì)菜單:菜單欄(JMenuBar)類(lèi)、菜單(JMenu)類(lèi)和菜單項(xiàng)(JMenuItem)類(lèi)對(duì)象組成菜單菜單欄菜單項(xiàng)11.2.4 菜單設(shè)計(jì)制作菜單的一般步驟: (1)創(chuàng)建一個(gè)JMenuBar對(duì)象并將其加入到JFrame中。 (2)創(chuàng)建JMenu對(duì)象。 (3)創(chuàng)建JMenuItem對(duì)象并將其添加到JMenu對(duì)象中。 (4)將JMenu對(duì)象添加到JMenuBar中。【實(shí)例11-6】import javax.swing.*;import .*;import java.awt.*;public class myMenuExample extends JFrame

19、 private JLabel display; public myMenuExample() super( 菜單演示程序 ); JMenuBar bar = new JMenuBar(); setJMenuBar(bar); JMenu filemenu = new JMenu( 文件 ); JMenuItem filenew=new JMenuItem(新建); JMenuItem fileopen=new JMenuItem(打開(kāi).); JMenuItem filesave=new JMenuItem( 保存); JMenuItem exit=new JMenuItem(退出); exi

20、t.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) System.exit( 0 ); );【實(shí)例11-6】 filemenu.add(filenew); filemenu.add(fileopen); filemenu.add(filesave); filemenu.addSeparator(); filemenu.add(exit); bar.add(filemenu); JMenu formatMenu = new JMenu(格式); JMenuItem colorMen

21、u=new JMenuItem( 顏色 );formatMenu.add(colorMenu);JMenuItem fontMenu=new JMenuItem( 字體 ); formatMenu.add(fontMenu );bar.add(formatMenu); setSize( 300, 200 );show(); 【實(shí)例11-6】 public static void main(String args) myMenuExample app = new myMenuExample(); app.addWindowListener(new WindowAdapter() public v

22、oid windowClosing( WindowEvent e ) System.exit(0); ); 11.2.5 對(duì)話框?qū)υ捒蚴窍蛴脩麸@示信息并獲取程序運(yùn)行所需數(shù)據(jù)的窗口,可以起到與用戶交互的作用。 Swing使用JOptionPane類(lèi)提供許多現(xiàn)成的對(duì)話框,如:消息對(duì)話框、確認(rèn)對(duì)話框、輸入對(duì)話框等等。如果JOptionPane提供的對(duì)話框不能滿足需要,可以使用JDialog類(lèi)自行設(shè)計(jì)對(duì)話框。11.2.5 對(duì)話框1JOptionPane對(duì)話框類(lèi)型(1)showMesageDialog:向用戶顯示一些消息。(2)showConfirmDialog:?jiǎn)栆粋€(gè)要求確認(rèn)的問(wèn)題并得到y(tǒng)es/no/

23、cancel響應(yīng)。(3)showInputDialog:提示用戶進(jìn)行輸入。(4)showOptionDialog:可選擇的對(duì)話框。這些方法中通過(guò)返回一個(gè)整數(shù),來(lái)表示用戶點(diǎn)擊了哪個(gè)按鈕,返回值的有效值有YES_OPTION、NO_OPTION、CANCEL_OPTION、OK_OPTION和CLOSED_OPTION。 11.2.5 對(duì)話框2模式和非模式對(duì)話框所謂模式對(duì)話框就是指必須經(jīng)過(guò)確認(rèn)才能繼續(xù)程序的運(yùn)行的對(duì)話框,創(chuàng)建的模式對(duì)話框有:口令對(duì)話框、刪除文件對(duì)話框、選擇參數(shù)對(duì)話框、錯(cuò)誤提示對(duì)話框等,這些對(duì)話框都是要求輸入數(shù)據(jù)或獲得確認(rèn)按鍵后才能關(guān)閉對(duì)話框的所謂非模式對(duì)話框就是指顯示對(duì)話框后,用戶

24、可以不用關(guān)閉此對(duì)話框繼續(xù)程序的運(yùn)行,如查找/替換對(duì)話框、插入符號(hào)對(duì)話框就是非模式對(duì)話框。實(shí)際上大部分對(duì)話框都是模式對(duì)話框。 11.2.5 對(duì)話框3Dialog類(lèi)如果JOptionPane提供的對(duì)話框無(wú)法滿足我們的需求,就需要使用JDialog來(lái)自行設(shè)計(jì)對(duì)話框。通過(guò)Dialog類(lèi)可以創(chuàng)建模式對(duì)話框和非模式對(duì)話框。【實(shí)例11-7】import java.awt.*;import .*;import javax.swing.*;public class myDialog extends JFrame private JButton jbt; private JLabel jlabel; public

25、 myDialog() super(一個(gè)顯示信息對(duì)話框的例子 ); Container cp=getContentPane(); cp.setLayout(new GridLayout(2,2,10,10); jbt=new JButton(顯示信息按鈕); cp.add(jbt); jbt.addActionListener(new handle(); jlabel=new JLabel(); cp.add(jlabel); setSize(500,450); show(); 【實(shí)例11-7】public class handle implements ActionListener publ

26、ic void actionPerformed(ActionEvent e) String title=信息對(duì)話框; String content=請(qǐng)選擇 (yes/no)?; int dialogtype=JOptionPane.YES_NO_OPTION; int choice=3; if(e.getSource()=jbt) choice=JOptionPane.showConfirmDialog(null,content,title,dialogtype); if(choice=0) jlabel.setText(您選擇的是YES); else jlabel.setText(您選擇的是

27、NO); public static void main(String args) myDialog app=new myDialog(); 11.3 布局管理器 FlowLayout布局 BorderLayout布局 GridLayout布局 CardLayout布局 null布局 FlowLayout布局java.FlowLayout類(lèi)是類(lèi)的直接子類(lèi)。FlowLayout的布局策略是將遵循這種布局策略的容器中的組件按照加入的先后順序從左向右排列,當(dāng)一行排滿之后就轉(zhuǎn)到下一行繼續(xù)從左至右排列,每一行中的組件都居中排列。 FlowLayout是Applet缺省使用的布局編輯策略。 FlowLay

28、out布局FlowLayout類(lèi)有三個(gè)構(gòu)造方法 (1) FlowLayout( ) 用于創(chuàng)建一個(gè)版面設(shè)定為居中對(duì)齊、各組件的水平及垂直間隔為5個(gè)像素點(diǎn)的布局(2) FlowLayout(int align) 用于創(chuàng)建一個(gè)FlowLayout類(lèi)的對(duì)象,版面按給出的align值對(duì)齊,各組件的水平及垂直間隔為5個(gè)像素。align的值可以是FlowLayout.LEFT(左對(duì)齊)、FlowLayout.RIGHT(右對(duì)齊)、FlowLayout.CENTER(居中對(duì)齊)方式。(3) FlowLayout(int align,int hgap,int vgap) 用于創(chuàng)建一個(gè)既指定對(duì)齊方式,又指定組件間

29、間隔的FlowLayout類(lèi)的對(duì)象。參數(shù)align作用及取值同上;參數(shù)hgap指定組件間的水平間隔;參數(shù)vgap指定各組件間的垂直間隔。間隔單位為像素點(diǎn)?!緦?shí)例11-8】import java.awt.*;import javax.swing.*;public class myFlowLayoutExamplepublic static void main(String args)JFrame jframe=new JFrame(一個(gè)滾動(dòng)列表的例子);Container cp=jframe.getContentPane();cp.setLayout(new FlowLayout();JButt

30、on jbt1=new JButton(足球);JButton jbt2=new JButton(籃球);JButton jbt3=new JButton(排球);JButton jbt4=new JButton(羽毛球);JButton jbt5=new JButton(乒乓球);cp.add(jbt1);cp.add(jbt2);cp.add(jbt3);cp.add(jbt4);cp.add(jbt5);jframe.setSize(150,200);jframe.show(); BorderLayout布局java.BorderLayout類(lèi)是類(lèi)的直接子類(lèi)。BorderLayout布局

31、策略是把容器內(nèi)的空間劃分為東、西、南、北、中五個(gè)區(qū)域(如圖9-4所示)。圖11.3 BordLayout布局示意圖中Center北(North)南(South)西West東East BorderLayout布局BorderLayout的構(gòu)造方法如下: public BorderLayout( ):創(chuàng)建一個(gè)各組件間的水平、垂直間隔為0的BorderLayout類(lèi)的對(duì)象。public BorderLayout( int hgap, int vgap ):創(chuàng)建一個(gè)各組件間的水平間隔為hgap、垂直間隔為vgap的BorderLayout類(lèi)的對(duì)象。 GridLayout布局GridLayout的布局策

32、略是把容器的空間劃分為若干行、若干列的網(wǎng)格區(qū)域,而每個(gè)組件按添加的順序從左向右、從上向下地占據(jù)這些網(wǎng)格。 GridLayout布局GridLayout類(lèi)的三個(gè)構(gòu)造方法如下:GridLayout( ):按默認(rèn)(1行1列)方式創(chuàng)建一個(gè)GridLayout布局。GridLayout(int rows,int cols):創(chuàng)建一個(gè)具有rows行、cols列的GridLayout布局。GridLayout(int rows,int cols,int hgap,int vgap):按指定的行數(shù)rows、列數(shù)cols、水平間隔hgap和垂直間隔vgap創(chuàng)建一個(gè)GridLayout布局。 CardLayout

33、布局CardLayout的版面布局方式是將每個(gè)組件看成一張卡片,如同撲克牌一樣將組件堆疊起來(lái),而顯示在屏幕上的每次只能是最上面的一個(gè)組件,這個(gè)被顯示的組件將占據(jù)所有的容器空間。CardLayout類(lèi)的構(gòu)造方法:1. public CardLayout( ) :使用默認(rèn)(間隔為0)方式創(chuàng)建一個(gè)CardLayout( )類(lèi)對(duì)象。2. public CardLayout( int hgap, int vgap ) :使用hgap指定的水平間隔和vgap指定的垂直間隔創(chuàng)建一個(gè)CardLayout( )類(lèi)對(duì)象。 CardLayout布局CardLayout類(lèi)的常用方法:1. public void fi

34、rst( Container parent ) :顯示第一張卡片。2. public void last( Container parent ):顯示最后一張卡片。3. public void next( Container parent ) :循環(huán)顯示下一張。4. public void previous( Container parent ):循環(huán)顯示前一張?!緦?shí)例11-10】import java.awt.*;import javax.swing.*;public class myCardLayoutExamplepublic static void main(String args)J

35、Frame jframe=new JFrame(一個(gè)滾動(dòng)列表的例子);Container cp=jframe.getContentPane();CardLayout card=new CardLayout(20,20);cp.setLayout(card);JButton jbt1=new JButton(足球);JButton jbt2=new JButton(籃球);JButton jbt3=new JButton(排球);JButton jbt4=new JButton(羽毛球);JButton jbt5=new JButton(乒乓球);【實(shí)例11-10】cp.add(a,jbt1);

36、cp.add(b,jbt2);cp.add(c,jbt3);cp.add(d,jbt4);cp.add(e,jbt5);card.next(cp);jframe.setSize(150,200);jframe.show(); null布局容器的布局也可以為null類(lèi)型,即空布局。如p.setLayout(null)。在這種布局下,利用add(c)方法向容器添加組件,組件c調(diào)用setBounds(int a,int b,int width,int height)方法設(shè)置該組件在容器中的位置和本身的大小。其中,是組件c的左上角在容器中的位置坐標(biāo);width、height是組件c的寬和高。利用get

37、Size().width和getSize(). height可以得到組件的寬度和高度?!緦?shí)例11-11】import java.awt.*;import javax.swing.*;public class myNullLayout extends JFrameJLabel 學(xué)號(hào),姓名,性別;JTextField stdno,name,sex; int x=0,y=0,w,h;Container cp=getContentPane();public myNullLayout() setLayout(null); 學(xué)號(hào)=new JLabel(學(xué)號(hào):,JLabel.CENTER);姓名=new J

38、Label(姓名:,JLabel.CENTER); 性別=new JLabel(性別,JLabel.CENTER);stdno=new JTextField();name=new JTextField();sex=new JTextField(); 【實(shí)例11-11】x=80;y=60;w=100;h=30;cp.add(學(xué)號(hào)); cp.add(姓名);cp.add(性別); cp.add(stdno);cp.add(name);cp.add(sex); 學(xué)號(hào).setBounds(0,y,w,h); stdno.setBounds(x,y,w,h);姓名.setBounds(0,2*y,w,h

39、);name.setBounds(x,2*y,w,h);性別.setBounds(0,3*y,w,h);sex.setBounds(x,3*y,w,h); setSize(300,500);show();public static void main(String args)myNullLayout obj=new myNullLayout();11.4 事件處理 委托事件模型 鍵盤(pán)事件 鼠標(biāo)事件 委托事件模型設(shè)計(jì)和實(shí)現(xiàn)圖形用戶界面的工作主要有兩個(gè):(1)創(chuàng)建組成界面的各種成分和元素,指定它們的屬性和位置關(guān)系,根據(jù)具體需要排列它們,從而構(gòu)成完整的圖形用戶界面的物理外觀;(2)定義圖形用戶界面的

40、事件和各界面元素對(duì)不同事件的響應(yīng),從而實(shí)現(xiàn)圖形用戶界面與用戶的交互功能。 委托事件模型委托事件模型的特點(diǎn)是將事件的處理委托給獨(dú)立的對(duì)象,而不是組件本身,從而將使用者界面與程序邏輯分開(kāi)。整個(gè)“委托事件模型”由產(chǎn)生事件的對(duì)象(事件源)、事件對(duì)象及監(jiān)聽(tīng)器對(duì)象之間的關(guān)系所組成,如圖9-5所示。事件源注冊(cè):對(duì)象名.addActionListener(監(jiān)聽(tīng)器者對(duì)象)監(jiān)聽(tīng)器實(shí)現(xiàn):public void actionPerformed(ActionEvent e)ActionEvent事件注冊(cè)觸發(fā)事件調(diào)用并傳遞參數(shù) 委托事件模型事件(event):代表了某對(duì)象可執(zhí)行的操作及其狀態(tài)的變化。例如:在圖形用戶界面中

41、,用戶可以通過(guò)移動(dòng)鼠標(biāo)對(duì)特定圖形界面元素進(jìn)行單擊、雙擊等操作來(lái)實(shí)現(xiàn)輸入/輸出操作。事件源指一個(gè)事件的產(chǎn)生者。事件監(jiān)聽(tīng)器就是接收事件對(duì)象并對(duì)其進(jìn)行處理的對(duì)象。 委托事件模型每一個(gè)事件類(lèi)都有一個(gè)“唯一”的事件處理方法接口如處理鼠標(biāo)事件“MouseEvent”類(lèi)的對(duì)應(yīng)接口為“MouseListener”接口, 處理按鈕“ActionEvent”事件類(lèi)的對(duì)應(yīng)接口為“ActionListener”接口。監(jiān)聽(tīng)器向事件源注冊(cè),使監(jiān)聽(tīng)器能夠監(jiān)聽(tīng)到并處理事件源產(chǎn)生的事件如ActionEvent事件,實(shí)現(xiàn)其接口ActionListener。 委托事件模型注冊(cè)監(jiān)聽(tīng)器采用addXXXListener( )方法實(shí)現(xiàn)A.

42、 addXXXListener(B):當(dāng)A發(fā)生XXX事件時(shí),對(duì)象B能得到通知,并將調(diào)用相應(yīng)的方法處理該事件。如:button事件,注冊(cè)監(jiān)聽(tīng)器為handler,則:button. addActionListener(handler); class handler implements ActionListenerpublic void actionPerformed(ActionEvent e) 委托事件模型Java中處理各組件事件的一般步驟是: 1新建一個(gè)組件(如JButton)。 2將該組件添加到相應(yīng)的面板(如JPanel)。 3注冊(cè)監(jiān)聽(tīng)器以監(jiān)聽(tīng)事件源產(chǎn)生的事件(如通過(guò)ActionListe

43、ner來(lái)響應(yīng)用戶點(diǎn)擊按鈕)。 4定義處理事件的方法(如在ActionListener中的actionPerformed中定義相應(yīng)方法)。以下將針對(duì)不同組件來(lái)詳細(xì)說(shuō)明。 鍵盤(pán)事件在java中,當(dāng)用戶使用鍵盤(pán)進(jìn)行操作時(shí),則會(huì)產(chǎn)生KeyEvent事件。監(jiān)聽(tīng)器要完成對(duì)事件的響應(yīng),就要實(shí)現(xiàn)KeyListener接口,或繼承KeyAdapter類(lèi),實(shí)現(xiàn)對(duì)類(lèi)中方法的定義。 在KeyListener這個(gè)接口中有如下三個(gè)事件: (1)KEY_PRESSED:表示鍵盤(pán)按鍵被按下事件。(2)KEY_RELEASED:表示鍵盤(pán)按鍵被釋放事件。(3)KEY_TYPED:表示鍵盤(pán)按鍵被敲擊事件。實(shí)現(xiàn)接口中keyPress

44、ed(Event e)、keyReleased(KeyEvent e)和keyTyped(KeyEvent e)方法,完成對(duì)上述三個(gè)對(duì)事件的處理 。【實(shí)例11-12】import javax.swing.*;import java.awt.*; import .*;public class myKeyEvent extends JFrame implements KeyListener private String line1=, line2 = ; private JTextArea textArea; public myKeyEvent() super( 顯示鍵盤(pán)事件演示程序 ); tex

45、tArea=new JTextArea(10,15); textArea.setText(按任意鍵繼續(xù).); textArea.setEnabled(false); textArea.setFont(new Font(TimesRoman,Font.BOLD+Font.ITALIC,18); getContentPane().add(textArea); addKeyListener(this); setSize(300,100); show(); 【實(shí)例11-12】 public void keyPressed(KeyEvent e) line1=鍵盤(pán)按下:+e.getKeyText(e.g

46、etKeyCode(); setString(e); public void keyReleased(KeyEvent e)line1=按鍵釋放: +e.getKeyText(e.getKeyCode();setString(e); public void keyTyped(KeyEvent e) line2=按鍵輸入: +e.getKeyChar(); setString(e); private void setString(KeyEvent e) textArea.setText(line1+n+line2); 【實(shí)例11-12】 public static void main(Strin

47、g args)myKeyEvent app = new myKeyEvent();app.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e)System.exit(0 );); 鼠標(biāo)事件在java中,當(dāng)用戶使用鼠標(biāo)進(jìn)行操作時(shí),則會(huì)產(chǎn)生鼠標(biāo)事件MouseEvent。對(duì)MouseEvent事件的響應(yīng)是實(shí)現(xiàn)MouseListener接口或MouseMotionListener接口,或者是繼承MouseApdapter類(lèi),來(lái)實(shí)現(xiàn)MouseApdapter提供的方法。與Mouse有關(guān)的事件可以分為兩

48、類(lèi):MouseListener接口,共提供了5種方法,主要針對(duì)鼠標(biāo)的按鍵和位置進(jìn)行檢測(cè);MouseMotionListener接口,共提供了兩種方法,主要針對(duì)鼠標(biāo)的坐標(biāo)和按鍵進(jìn)行檢測(cè)?!緦?shí)例11-13】import java.awt.*;import .*;import javax.swing.*;public class myMouseEvent extends JFrame private JTextField text; public myMouseEvent()super(鼠標(biāo)事件測(cè)試?yán)?;Container cp=getContentPane();cp.setLayout(new

49、BorderLayout(5,5);JLabel label=new JLabel(移動(dòng)拖動(dòng)鼠標(biāo));Font g = new Font(Courier, Font.BOLD, 22);label.setFont(g); cp.add(label,BorderLayout.NORTH);text=new JTextField(20);cp.add(text,BorderLayout.SOUTH); cp.addMouseMotionListener(new MouseMotionHandler(); cp.addMouseListener(new MouseEventHandler(); set

50、Size(300,450);show(); 【實(shí)例11-13】 public class MouseMotionHandler extends MouseMotionAdapter public void mouseDragged(MouseEvent e) String s=鼠標(biāo)拖動(dòng):X=+e.getX()+Y=+e.getY(); text.setText(s); public class MouseEventHandler extends MouseAdapter public void mouseEntered(MouseEvent e) String s=鼠標(biāo)進(jìn)入!; text.se

51、tText(s); public void mouseExited(MouseEvent e) String s=鼠標(biāo)離開(kāi)!; text.setText(s); 【實(shí)例11-13】 public static void main(String args) myMouseEvent app=new myMouseEvent();app.addWindowListener( new WindowAdapter()public void windowClosing(WindowEvent e) System.exit( 0 ); ); 11.5 常用組件 按鈕 標(biāo)簽 文本行 文本域 復(fù)選框 單選框

52、選擇框 列表 按鈕下面是一個(gè)處理按鈕事件的例子,JFrame窗口中有三個(gè)按鈕,一個(gè)標(biāo)簽,點(diǎn)擊按鈕后修改標(biāo)簽名字提示點(diǎn)擊的是那個(gè)按鈕?!緦?shí)例11-14】import java.awt.*;import javax.swing.*;import .*;public class myJButtonEvent extends JFrame implements ActionListenerJButton jbt1,jbt2,jbt3;JLabel jlabe1;Container cp=getContentPane();public myJButtonEvent()cp.setLayout(new F

53、lowLayout(); jbt1=new JButton(足 球);jbt2=new JButton(籃 球);jbt3=new JButton(乒 乓 球);jlabe1=new JLabel(選擇的球類(lèi)是:.);cp.add(jbt1); jbt1.addActionListener(this);cp.add(jbt2);【實(shí)例11-14】jbt2.addActionListener(this);cp.add(jbt3);jbt3.addActionListener(this);cp.add(jlabe1); setSize(300,100);show(); public void ac

54、tionPerformed(ActionEvent e)String str=;if (e.getSource( )=jbt1) str=足球;else if (e.getSource( )=jbt2) str=籃球; else if (e.getSource( )=jbt3) str=乒乓球;jlabe1.setText(選擇的球類(lèi)是:+str);public static void main(String args)myJButtonEvent obj=new myJButtonEvent(); 標(biāo)簽標(biāo)簽是用來(lái)顯示一個(gè)單行文本的組件。AWT的Label類(lèi)和Swing 的JLabel類(lèi)是用于

55、創(chuàng)建標(biāo)簽的。【實(shí)例11-15】import java.awt.*;import javax.swing.*;public class myJLabelExamplepublic static void main(String args)JFrame jframe=new JFrame(一個(gè)標(biāo)簽的例子);Container contentPane=jframe.getContentPane();contentPane.setLayout(new FlowLayout();JLabel jlabel1=new JLabel(姓名);JLabel jlabel2=new JLabel(性別);JLa

56、bel jlabel3=new JLabel(年齡);contentPane.add(jlabel1);contentPane.add(jlabel2);contentPane.add(jlabel3);jframe.setSize(400,250);jframe.show(); 文本行文本行是一個(gè)單行的文本域,可接受從鍵盤(pán)輸入的信息。AWT的TextField類(lèi)和Swing 的JTextField類(lèi)是用于創(chuàng)建文本行的。 文本行5文本行事件處理常用響應(yīng)事件:ActionEvent事件監(jiān)視器設(shè)置:addActionListener(ActionListener)接口方法:actionPerfor

57、med(ActionEvent e)。主要方法public void addActionListener( ActionListener obj ):將obj對(duì)象指定為文本行的監(jiān)聽(tīng)器。public void removeActionListener( ActionListener obj ):將obj對(duì)象從監(jiān)聽(tīng)器中去掉。 文本行例如,下面是一個(gè)處理文本行事件的例子,JFrame窗口中有三個(gè)標(biāo)簽,三個(gè)文本行,一旦在第一、第二文本行輸入數(shù)據(jù),并且第二文本行(被乘數(shù))輸入回車(chē)鍵后,在第三文本行(乘積)顯示乘積。【實(shí)例11-15】import java.awt.*;import javax.swing

58、.*;import .*;public class myJTextFieldEvent extends JFrame implements ActionListenerJTextField jtextfield1,jtextfield2,jtextfield3;JLabel jlabe11,jlabe12,jlabe13;Container cp=getContentPane();public myJTextFieldEvent()setTitle(一個(gè)文本行事件處理的例子);cp.setLayout(new FlowLayout(); jlabe11=new JLabel(乘 數(shù));jtex

59、tfield1=new JTextField(20);jlabe12=new JLabel(被 乘 數(shù));jtextfield2=new JTextField(20);jlabe13=new JLabel(乘 積);jtextfield3=new JTextField(20);【實(shí)例11-15】cp.add(jlabe11);cp.add(jtextfield1);cp.add(jlabe12);cp.add(jtextfield2);cp.add(jlabe13);cp.add(jtextfield3);jtextfield2.addActionListener(this);setSize(

60、350,150);show(); public void actionPerformed(ActionEvent e)long n1,n2;if (e.getSource( )=jtextfield2)n1=Long.parseLong(jtextfield1.getText();/乘數(shù)n1n2=Long.parseLong(jtextfield2.getText();/被乘數(shù)n2jtextfield3.setText(String.valueOf(n1*n2);public static void main(String args)myJTextFieldEvent obj=new myJT

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論