版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第9章 圖形用戶界面了解Java GUI的發(fā)展歷史掌握常用Swing組件的功能和應(yīng)用掌握eclipse可視化開發(fā)環(huán)境下圖形用戶界面的設(shè)計(jì)方法理解Java的事件處理機(jī)制學(xué)習(xí)目標(biāo):9.1生成圖形化用戶界面9.2框架9.3Java布局管理9.4 Java事件處理9.5常用Swing組件的使用9.6實(shí)訓(xùn):簡(jiǎn)易聊天界面9.7習(xí)題 第9章 圖形用戶界面9.1.1GUI概述9.1.2 Java圖形用戶界面的構(gòu)成9.1生成圖形化用戶界面 圖形用戶界面可以為應(yīng)用程序提供想要的“外觀”或表示,然后對(duì)其添加必要的業(yè)務(wù)邏輯程序,以便使它們能夠發(fā)揮效用。在該界面下用戶往往只需通過(guò)單擊、雙擊、拖曳鼠標(biāo)和簡(jiǎn)單的文字鍵入就可
2、以輕松地操作計(jì)算機(jī)完成任務(wù)。圖形用戶界面生動(dòng)形象、操作直觀簡(jiǎn)便。 圖形用戶界面(Graphics User Interface,簡(jiǎn)稱GUI)是指以圖形的方式實(shí)現(xiàn)人與計(jì)算機(jī)之間的交互。用戶與這些組件(例如按鈕、文本、列表等)進(jìn)行交互,為系統(tǒng)提供信息和從系統(tǒng)獲取信息,以便完成客戶的需求。1. AWT 當(dāng)Java在1995年的春天第一次發(fā)布的時(shí)候,它包含了一個(gè)叫AWT(Abstract Windowing Toolkit)的庫(kù),用來(lái)構(gòu)建圖形用戶界面應(yīng)用程序。Java很有雄心的宣言write once, run anywhere許諾:一個(gè)具有下拉菜單,命令按鈕,滾動(dòng)條以及其他常見的GUI控件的應(yīng)用程序
3、將能夠在各種操作系統(tǒng)上運(yùn)行而不必重新編譯成針對(duì)某一平臺(tái)的二進(jìn)制代碼。9.1.1 GUI概述 為了方便用Java構(gòu)建圖形用戶界面,Sun最初提供了一個(gè)在所有平臺(tái)下具有的獨(dú)特Java外觀的圖形界面庫(kù)。Sun在applet技術(shù)策略方面的首要伙伴Netscape提出applets應(yīng)該維持和運(yùn)行時(shí)平臺(tái)一樣的外觀。他們希望applets在某一平臺(tái)下在顯示和行為上能夠像其他應(yīng)用程序一樣。為了實(shí)現(xiàn)Netscape的本地外觀的目標(biāo),在JDK的第一個(gè)發(fā)布版中包含了AWT這個(gè)庫(kù)。但是當(dāng)利用AWT來(lái)構(gòu)建圖形用戶界面的時(shí)候,實(shí)際上是在利用本地操作系統(tǒng)所提供的圖形庫(kù),也就是說(shuō)AWT所提供的圖形設(shè)計(jì)功能是有一定局限性的。使
4、用AWT開發(fā)出來(lái)的圖形用戶界面在使用上非常的不靈活。比如AWT所包含的組件,其外觀是固定的,無(wú)法改變,這就使得開發(fā)出來(lái)的界面非常死板。2Swing 由于awt包的不足表現(xiàn),SUN公司于1998年針對(duì)它存在的問(wèn)題,對(duì)其進(jìn)行了擴(kuò)展,開發(fā)出新的GUI組件叫做Swing。Swing是Java語(yǔ)言提供的第二代設(shè)計(jì)工具,它以AWT為基礎(chǔ),提供了比AWT更多的特性和工具,用于建立更復(fù)雜的圖形用戶界面。Swing開發(fā)人員只用很少的代碼就可以利用Swing豐富、靈活的功能和模塊化組件來(lái)創(chuàng)建優(yōu)雅的用戶界面。 工具包中所有的包都是以swing作為名稱,例如javax.swing,javax.swing.event。
5、現(xiàn)在常采用Swing組件來(lái)開發(fā)GUI應(yīng)用程序。 Java圖形用戶界面主要由容器、標(biāo)準(zhǔn)組件和用戶自定義成分構(gòu)成。 容器是用來(lái)組織其他界面成分和元素的單元。一般一個(gè)圖形用戶界面對(duì)應(yīng)一個(gè)復(fù)雜容器。 標(biāo)準(zhǔn)組件是圖形用戶界面的最小單位,它里面不再包含其他的成分。GUI組件是圖形用戶界面標(biāo)準(zhǔn)化的結(jié)果。常用的組件有(1)選擇類:?jiǎn)芜x按鈕、復(fù)選按鈕、下拉列表;(2)文字處理類的:文本框、文本區(qū)域;(3)命令類的: 按鈕、菜單等。GUI組件的作用是完成與用戶的交互。包括接收用戶的命令、文本或選擇輸入,向用戶顯示一段文本或一個(gè)圖形等。9.1.2 Java圖形用戶界面的構(gòu)成 用戶自定義成分是指編程人員根據(jù)用戶需要設(shè)
6、計(jì)一些用戶自定義的圖形界面成分,如顯示文字、繪制圖形、顯示圖象等。但用戶自定義成分不能像標(biāo)準(zhǔn)組件一樣被系統(tǒng)識(shí)別和承認(rèn),只起裝飾作用。不能響應(yīng)用戶的動(dòng)作,不具有交互功能。如圖9-1所示。9.2.1 構(gòu)建框架9.2.2 添加組件9.2 框架 在應(yīng)用程序中,使用框架作為容器,在框架中放置組件。SWING組件從功能上分為:容器和基本組件;容器又分為頂層容器和中間層容器。 (1)頂層容器:JFrame、JDialog、JApplet 。用于構(gòu)造圖形用戶界面的窗口,并容納其它容器和組件,它們可以獨(dú)立存在 。(2)中間層容器 :JPanel、JScrollPane、JToolBar等。容納其它組件,但是不能
7、獨(dú)立存在,需要添加到其它容器中。通常用來(lái)按功能組織基本組件 。基本組件:按鈕JButton、文本框JTextField等等。是圖形用戶界面的基本組成單位,不能獨(dú)立存在,必須將其添加到一定的容器中。 在Java中,頂層窗口被稱為框架。在AWT中這個(gè)類被稱為Frame,在Swing中稱為JFrame,它擴(kuò)展于Frame類。JFrame創(chuàng)建的框架窗口可以獨(dú)立存在,并且?guī)в羞吙颉?biāo)題及用于關(guān)閉和最大化、最小化窗口的圖標(biāo)按鈕。 【例9-1】創(chuàng)建一個(gè)框架窗口舉例。解題思路:每一個(gè)Java的GUI程序都必須至少包含一個(gè)頂層容器組件作為窗口。代碼:程序JFrameDemo.javaimport javax.s
8、wing.*; public class JFrameDemo extends JFrame public JFrameDemo()super(JFrame窗口); 9.2.1 構(gòu)建框架setBounds(50,50,300,120); setDefaultCloseOperation(EXIT_ON_CLOSE);setVisible(true); public static void main(String args) JFrameDemo f = new JFrameDemo(); 運(yùn)行結(jié)果如圖9-2所示。圖9-2 一個(gè)窗口運(yùn)行結(jié)果 【說(shuō)明】 public void setBounds(
9、int x,int y,int width,int height) 是設(shè)置出現(xiàn)在屏幕上時(shí)的初始位置為(x,y),即距屏幕左面x個(gè)像素,距屏幕上方y(tǒng)個(gè)像素;width是窗口的寬,height是高。構(gòu)成圖形用戶界面的各種元素稱為組件。容器是圖形用戶界面中容納組件的部分,一個(gè)容器可容納一個(gè)或多個(gè)組件,甚至可以容納其他容器?!纠?-2】在窗口中添加組件舉例。解題思路:放在“JFrame”中的每個(gè)一信息都是一個(gè)組件。代碼:程序FrameEx.javaimport java.awt.*;import javax.swing.*;public class FrameEx public void go() 9
10、.2.2添加組件 JFrame win = new JFrame(JFrame); Container contentPane = win.getContentPane(); contentPane.setLayout(new GridLayout(5,1); JLabel labOne = new JLabel(Swing組件學(xué)習(xí),JLabel.CENTER); JLabel labTwo = new JLabel(計(jì)算機(jī)學(xué)院,JLabel.CENTER); JButton queding = new JButton(確定); contentPane.add(labOne); content
11、Pane.add(labTwo); contentPane.add(queding); win.setSize(200,200); win.setVisible(true); public static void main(String arg) FrameEx fe = new FrameEx(); fe.go(); 運(yùn)行結(jié)果如圖9-3所示。 【說(shuō)明】 第1行和第2行的作用就是將awt包和swing包引入到該程序中,因?yàn)樵摮绦蛑幸玫絘wt包和swing包中的類。例如Container類和GridLayout類都屬于awt包。其他以“J”開頭的類都屬于swing包。Containe類是Jav
12、a語(yǔ)言的開發(fā)者事先定義好的類。關(guān)于這個(gè)類的一些功能也是設(shè)定好的。作為使用者,只要將這個(gè)類用import的方式引入到自己的程序中就可以使用它了。這兩個(gè)包的引用會(huì)在圖形用戶界面的程序中經(jīng)常用到。9.3.1BorderLayout9.3.2FlowLayout9.3.3GridLayout9.3.4CardLayout9.3.5案例1:常用布局管理器設(shè)計(jì)計(jì)算器界面9.3 Java布局管理 組件在被放到容器中時(shí),要遵循一定的布局方式。在Java的圖形用戶界面中,有專門的類來(lái)管理組件的布局,稱這些類為布局管理器。在“JFrame”中每一條信息都是一個(gè)組件,這些組件應(yīng)該如何安排就是由布局管理器負(fù)責(zé)的。所謂
13、的布局管理器,實(shí)際上就是能夠?qū)M件進(jìn)行布局管理的類。用吃飯的例子就能很好的說(shuō)明容器、組件和布局之間的關(guān)系。容器就是吃飯的桌子,組件就是一盤盤的菜。我們吃飯時(shí)要安排菜應(yīng)該放在什么位置,這就是布局管理器。 BorderLayout又稱邊界布局管理器,它將窗口劃分為東、西、南、北、中五個(gè)區(qū)域,這五個(gè)區(qū)域分別用英文East、West、South、North、Center表示。用參數(shù)BorderLayout.EAST、BorderLayout.WEST、BorderLayout.SOUTH、BorderLayout.NORTH和BorderLayout.CENTER來(lái)表示。在窗口中添加組件時(shí),系統(tǒng)會(huì)根據(jù)
14、參數(shù)將組件擺放到窗口的相應(yīng)位置?!纠?-3】應(yīng)用BorderLayout布局舉例。 解題思路:通過(guò)setLayout()方法可以完成BorderLayout布局管理器的設(shè)置,語(yǔ)句為:contentPane.setLayout(new BorderLayout();9.3.1BorderLayout代碼:程序BorLayDemo.javaimport java.awt.*;import javax.swing.*;public class BorLayDemo extends JFrame private JButton myButton1,myButton2,myButton3,myButto
15、n4,myButton5;public BorLayDemo() super(BorderLayout布局); setBounds(50,50,300,120); setLayout(new BorderLayout(); /設(shè)置窗口為邊界布局setDefaultCloseOperation(EXIT_ON_CLOSE);setVisible(true);myButton1=new JButton(東按鈕);myButton2=new JButton(南按鈕);myButton3=new JButton(西按鈕);myButton4=new JButton(北按鈕);myButton5=new
16、 JButton(中間按鈕);add(East,myButton1); /添加按鈕到窗口指定方位add(South,myButton2);add(West,myButton3);add(North,myButton4);add(Center,myButton5);public static void main(String args) BorLayDemo f = new BorLayDemo(); 運(yùn)行結(jié)果如圖9-4所示。圖9-4 BorderLayout布局運(yùn)行結(jié)果【說(shuō)明】在窗口中添加組件時(shí),系統(tǒng)會(huì)根據(jù)參數(shù)將組件擺放到窗口的相應(yīng)位置。如果當(dāng)中央位置沒(méi)有擺放組件時(shí),位置被空缺,其他位置的組件
17、不會(huì)占用中央的位置。 FlowLayout是一個(gè)最簡(jiǎn)單的布局管理器,這個(gè)布局管理器的功能就是將容器中的組件從左到右,從上到下的排列。因此,它又被稱為流布局管理器?!纠?-4】 應(yīng)用FlowLayout布局舉例。解題思路:采用FlowLayut布局管理器,所有組件是按照添加時(shí)的順序,按從左到右,從上到下的順序排列的。代碼:程序FlowLayDemo.javaimport java.awt.*;import javax.swing.*;public class FlowLayDemo extends JFrame private JButton myButton1,myButton2,myButt
18、on3,myButton4,myButton5;9.3.2FlowLayoutpublic FlowLayDemo() / FlowLayDemo類的構(gòu)造方法 super(FlowLayout布局); setBounds(60,60,200,150); setLayout(new FlowLayout(); /設(shè)置窗口為流式布局setDefaultCloseOperation(EXIT_ON_CLOSE);setVisible(true);myButton1=new JButton(按鈕1); /生成按鈕對(duì)象myButton2=new JButton(按鈕2);myButton3=new JB
19、utton(按鈕3);myButton4=new JButton(按鈕4);myButton5=new JButton(按鈕5);add(myButton1); /添加按鈕到窗口上圖7.4(a) 流式布局add(myButton2);add(myButton3);add(myButton4);add(myButton5);public static void main(String args) FlowLayDemo f=new FlowLayDemo(); 運(yùn)行結(jié)果如圖9-5所示。圖9-5 FlowLayout布局運(yùn)行結(jié)果 【說(shuō)明】默認(rèn)情況下,第一個(gè)被添加的組件擺放在第1行居中位置,其后添加
20、的組件擺放在第一個(gè)組件的后面。當(dāng)?shù)?行再也放不下組件的時(shí)候,其后的組件從第2行開始從左到右擺放。以此類推,直到添加完所有組件。GridLayout又稱網(wǎng)格布局管理器。相對(duì)于FlowLayout和BorderLayout來(lái)說(shuō),GridLayout局管理器是比較靈活的一種管理器。它可以通過(guò)行數(shù)和列數(shù)的設(shè)置,把窗口劃分成若干個(gè)單元格,將組件放在這些單元格里?!纠?-5】 應(yīng)用GridLayout布局舉例。解題思路:GridLayout的括號(hào)中兩個(gè)參數(shù)的含義就是(行數(shù),列數(shù))。通過(guò)改變這兩個(gè)參數(shù)的值,將窗口劃分成不同的單元格。代碼:程序GridLayDemo.javaimport java.awt.*
21、;import javax.swing.*;public class GridLayDemo extends JFrame 9.3.3GridLayoutprivate String names=按鈕a,按鈕b,按鈕c,按鈕d,按鈕e,按鈕f;public GridLayDemo() super(GridLayout布局); setBounds(60,60,300,200); setLayout(new GridLayout(3,3); /設(shè)置三行三列網(wǎng)格布局setDefaultCloseOperation(EXIT_ON_CLOSE);setVisible(true);for (int i=
22、0;inames.length;i+) add(new JButton(namesi); /依次添加各個(gè)按鈕public static void main(String args) GridLayDemo f=new GridLayDemo(); 運(yùn)行結(jié)果如圖9-6所示。圖9-6 GridLayout布局運(yùn)行結(jié)果 【說(shuō)明】GridLayout布局管理器也可以不設(shè)置行數(shù)和列數(shù),這時(shí)系統(tǒng)會(huì)默認(rèn)行數(shù)和列數(shù)均為1。如果要擺放的組件大于GridLayout所設(shè)置的單元格個(gè)數(shù),多出來(lái)的組件也會(huì)被擺放在窗口中,但是會(huì)破壞原來(lái)的單元格樣式。 CardLayout又稱卡片布局。使用CardLayout容器可以容
23、納多個(gè)組件,但是實(shí)際上同一時(shí)刻容器只能從這些組件中選出一個(gè)來(lái)顯示,就像一疊“撲克牌”每次只能顯示最上面的一張一樣,這個(gè)被顯示的組件將占據(jù)所有的容器空間?!纠?-5】 應(yīng)用CarLayout布局舉例。解題思路:在選項(xiàng)卡窗格中添加5個(gè)按鈕,并設(shè)置相對(duì)應(yīng)的選項(xiàng)卡的文本提示,然后將選項(xiàng)卡窗格添加到窗體的內(nèi)容面板中。代碼:程序CardLayDemo.javaimport java.awt.*;import javax.swing.*;9.3.4CardLayoutpublic class CardLayDemo extends JFrame JTabbedPane p;Icon icon;private
24、 String imageName=a.jpg,b.jpg,c.jpg,d.jpg,e.jpg;public CardLayDemo() super(CardLayout布局); setBounds(100,100,500,300); setVisible(true);icon=new IconimageName.length;for (int i=0;iicon.length;i+) iconi=new ImageIcon(imageNamei);p=new JTabbedPane(JTabbedPane.LEFT);for (int i=0;iicon.length;i+)int m=i+
25、1;p.add(觀看第+m+個(gè)圖片,new JButton(iconi); p.validate();add(p,BorderLayout.CENTER); validate();setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);public static void main(String args) CardLayDemo f=new CardLayDemo(); 運(yùn)行結(jié)果如圖9-7所示。圖9-7 CarLayout布局運(yùn)行結(jié)果【說(shuō)明】本例中用了嵌套JTabbedPane的窗體。解題思路:對(duì)窗體應(yīng)用邊界布局,在NORTH上放置一個(gè)文本框,在C
26、ENTER上放置一個(gè)面板,面板上放置計(jì)算器的相應(yīng)按鈕。代碼:GridFrame.javaimport java.awt.*;import javax.swing.*;class GridFrame extends JFrame /定義面板,并設(shè)置為網(wǎng)格布局,4行4列,組件水平、垂直間距均為3 JPanel p=new JPanel(new GridLayout(4,4,3,3); JTextArea t=new JTextArea(); /定義文本框 /定義字符串?dāng)?shù)組,為按鈕的顯示文本賦值 String 9.3.5案例1:常用布局管理器設(shè)計(jì)計(jì)算器界面str=7,8,9,/,4,5,6,*,1,
27、2,3,-,0,.,=,+; public GridFrame(String s) super(s); /為窗體名稱賦值 setLayout(new BorderLayout(); /定義窗體布局為邊界布局 JButton btn; /聲明按鈕數(shù)組 btn=new JButtonstr.length; /創(chuàng)建按鈕數(shù)組 for(int i=0;istr.length;i+) btni=new JButton(stri); p.add(btni); getContentPane().add(t,BorderLayout.NORTH); /將文本框放置在窗體NORTH位置 getContentPan
28、e().add(p,BorderLayout.CENTER); /將面板放置在窗體CENTER位置 setVisible(true); setSize(250,200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); /讓窗體居中顯示 public static void main(String args) GridFrame gl=new GridFrame(一個(gè)簡(jiǎn)單的計(jì)算器); 運(yùn)行結(jié)果如圖9-8所示。9.4.1事件和事件源9.4.2事件監(jiān)聽器9.4.3監(jiān)聽器接口9.4 Java事件
29、處理從JDK1.1開始起,Java語(yǔ)言采用基于代理的事件處理模型。當(dāng)用戶在文本框中鍵入文本后按回車鍵、單擊按鈕、在一個(gè)下拉式列表中選擇一個(gè)條目等操作時(shí),都發(fā)生界面事件?;诖硎录幚砟P褪且M(jìn)了監(jiān)聽器接口,每個(gè)事件類都有相關(guān)聯(lián)的監(jiān)聽器接口。GUI組件如果注冊(cè)了相關(guān)的監(jiān)聽器對(duì)象,監(jiān)聽器對(duì)象會(huì)一直監(jiān)聽已注冊(cè)的組件對(duì)象是否有事件發(fā)生。當(dāng)監(jiān)聽器對(duì)象監(jiān)聽到組件有相對(duì)應(yīng)的事件發(fā)生,就會(huì)調(diào)用監(jiān)聽器對(duì)象中方法,即事件處理器來(lái)實(shí)現(xiàn)一定的動(dòng)作。就這樣,通過(guò)對(duì)目標(biāo)監(jiān)聽器對(duì)象的相關(guān)Java方法調(diào)用,實(shí)現(xiàn)事件從事件源到監(jiān)聽者的傳遞。 在學(xué)習(xí)處理事件時(shí),必須很好的掌握事件源、監(jiān)聽器和處理事件的接口這三個(gè)概念。 事件是程
30、序運(yùn)行中出現(xiàn)的行為和動(dòng)作的反映。典型的事件包括:?jiǎn)螕舭粹o、在文本框輸入數(shù)據(jù)等。當(dāng)用戶移動(dòng)鼠標(biāo),單擊按鈕時(shí),一個(gè)事件就產(chǎn)生了??赡墚a(chǎn)生事件的組件稱為事件源,不同事件源上發(fā)生的事件種類是不同的。例如:按鈕JButton button = new JButton();圖形界面都是事件驅(qū)動(dòng)的,即當(dāng)用戶和界面進(jìn)行交互通信時(shí)產(chǎn)生事件,并由此觸發(fā)事件處理程序。9.4.1事件和事件源 若希望事件源上引發(fā)的事件被程序處理,需要將事件源注冊(cè)這 種事件類型的監(jiān)聽器。監(jiān)聽器具有監(jiān)聽和處理某類事件的功能。例如,可以給按鈕的動(dòng)作事件(ActionEvent)注冊(cè)一個(gè)動(dòng)作事件監(jiān)聽器(ActionListener) 。通過(guò)注
31、冊(cè)監(jiān)聽器,我們可以監(jiān)聽事件源產(chǎn)生的事件,從而在事件處理程序中處理我們所需要處理的用戶行為。 當(dāng)用戶單擊這個(gè)按鈕時(shí),標(biāo)簽里的文字由“HELLO!”變成“你好!”程序如下:9.4.2事件監(jiān)聽器事件處理過(guò)程:(1)利用addActionListener方法為JButton按鈕添加了一個(gè)監(jiān)聽器;(2)當(dāng)事件源button發(fā)生動(dòng)作事件時(shí),即用戶單擊按鈕,按鈕就會(huì)自動(dòng)調(diào)用監(jiān)聽器對(duì)象中的actionPerformed(ActionEvent arg0)方法,并且所發(fā)生的動(dòng)作事件以一個(gè)ActionEvent類型的對(duì)象傳遞進(jìn)來(lái)。一個(gè)事件監(jiān)聽器可以處理一類事件,要使監(jiān)聽器具有處理某一類事件的能力,就需要讓監(jiān)聽器實(shí)
32、現(xiàn)相應(yīng)的事件監(jiān)聽器接口,即一個(gè)監(jiān)聽器對(duì)象是一個(gè)實(shí)現(xiàn)了特定監(jiān)聽器接口的類的實(shí)例。一般語(yǔ)法形式如下:9.4.3監(jiān)聽器接口【例9-6】一個(gè)文字框的文字顏色設(shè)置的程序舉例。解題思路:導(dǎo)入事件處理的軟件包java.awt.event,然后定義文本框組件和按鈕組件;再將按鈕組件注冊(cè)相應(yīng)的監(jiān)聽器對(duì)象。代碼:程序SimpleEventHandling.javaimport java.awt.*;import javax.swing.*;import java.awt.event.*; public class SimpleEventHandling extends JFrame implements Acti
33、onListener /實(shí)現(xiàn)接口JTextField text; /定義文本框textJButton colorButton; /定義選顏色的按鈕colorButtonContainer container; public SimpleEventHandling()super(顏色版);container=getContentPane();container.setLayout(new FlowLayout();text=new JTextField(我可以變顏色); colorButton=new JButton(請(qǐng)選擇你喜歡的顏色);colorButton.addActionListene
34、r(this); /注冊(cè)監(jiān)聽器container.add(text);container.add(colorButton);pack();setVisible(true);public void actionPerformed(ActionEvent e) /實(shí)現(xiàn)接口ActionListener的方法actionPerformed() if(e.getSource()=colorButton) Color colorstyle=Color.black; colorstyle=JColorChooser.showDialog(this,選擇顏色,colorstyle); text.setFore
35、ground(colorstyle); colorButton.setForeground(colorstyle); public static void main(String args)SimpleEventHandling seh=new SimpleEventHandling();seh.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);運(yùn)行結(jié)果如圖9-9所示。圖9-9 運(yùn)行結(jié)果【說(shuō)明】本例是實(shí)現(xiàn)一個(gè)ActionListener接口,所以,注冊(cè)按鈕組件到實(shí)現(xiàn)該接口的實(shí)例對(duì)象。為了能出現(xiàn)顏色的選擇處理,對(duì)ActionListener接口的方法a
36、ctionPerformed()進(jìn)行定義,實(shí)現(xiàn)顏色選擇的動(dòng)作。 Java語(yǔ)言中提供事件處理的包主要有java.awt.event和javax.swing.event包。其中,java.awt.event包提供了對(duì)awt包和swing包常見組件的支持,與事件處理相關(guān)常見的的事件類和事件監(jiān)聽器接口見表9-1。 通過(guò)實(shí)現(xiàn)監(jiān)聽器接口來(lái)編寫一個(gè)監(jiān)聽器類的時(shí)候,接口中所定義的所有抽象方法都需要被實(shí)現(xiàn),即使對(duì)處理某個(gè)事件的方法不感興趣,仍然要編寫一個(gè)空方法體。這樣在某些情況會(huì)很繁瑣。為了解決這個(gè)問(wèn)題,AWT提供了與監(jiān)聽器接口配套的適配器類。對(duì)于監(jiān)聽器接口里定義的每個(gè)抽象方法,在適配器類中都有一個(gè)空的實(shí)現(xiàn)方法
37、,這樣可以減少編程的繁瑣。java.awt.event中的適配器類見表9-2?!纠?-7】菜單事件舉例。 解題思路:菜單項(xiàng)是JMenuItem對(duì)象,可以通過(guò)點(diǎn)擊動(dòng)作來(lái)激活動(dòng)作事件;菜單項(xiàng)是JCheckBoxMenuItem對(duì)象,可以采用選項(xiàng)事件處理的方式進(jìn)行處理。菜單項(xiàng)是JRadioButtonMenuItem對(duì)象,則可以選擇用動(dòng)作事件或選項(xiàng)事件處理。代碼:程序SimpleMenu.javaimport java.awt.*;import javax.swing.*;import java.awt.event.*; public class SimpleMenu extends JFrame
38、JMenuBar b; /定義菜單條 JMenu menua,menub,menuc; /定義菜單 JCheckBoxMenuItem a1; /定義復(fù)選菜單項(xiàng) JCheckBoxMenuItem b2; /定義復(fù)選菜單項(xiàng) JRadioButtonMenuItem c3; /定義單選菜單項(xiàng) ButtonGroup group; /定義按鈕組 JTextArea displayArea; /定義文本區(qū)public SimpleMenu()super(院系導(dǎo)航);Container c=getContentPane();b=new JMenuBar(); /創(chuàng)建菜單條menua=new JMenu
39、(計(jì)算機(jī)學(xué)院); /創(chuàng)建菜單a1=new JCheckBoxMenuItem3; /創(chuàng)建菜單項(xiàng)for(int i=0;ia1.length;i+) a1i=new JCheckBoxMenuItem(計(jì)算機(jī)學(xué)院系+(i+1); menua.add(a1i); a1i.addItemListener(new CheckBoxListener(); menub=new JMenu(外語(yǔ)學(xué)院); b2=new JCheckBoxMenuItem3; group=new ButtonGroup(); for(int i=0;ib2.length;i+) b2i=new JCheckBoxMenuIte
40、m(外語(yǔ)學(xué)院系+(i+1); menub.add(b2i); b2i.addItemListener(new CheckBoxListener(); menuc=new JMenu(管理學(xué)院);c3=new JRadioButtonMenuItem3; for(int i=0;ic3.length;i+) c3i=new JRadioButtonMenuItem(管理學(xué)院系+(i+1);c3i.addItemListener(new RadioListener(); group.add(c3i);menuc.add(c3i);b.add(menua); b.add(menub); b.add(
41、menuc); /菜單條上添加菜單setJMenuBar(b);displayArea=new JTextArea(35,35);c.add(displayArea,BorderLayout.CENTER);setSize(200,200);setVisible(true);class CheckBoxListener implements ItemListener /定義復(fù)選菜單監(jiān)視器public void itemStateChanged(ItemEvent e)JMenuItem item=(JMenuItem)e.getSource();if(e.getStateChange()=e.
42、SELECTED) displayArea.append(item.getText()+n);class RadioListener implements ItemListener /定義單選菜單監(jiān)視器public void itemStateChanged(ItemEvent e)JMenuItem item=(JMenuItem)e.getSource();if(e.getStateChange()=e.SELECTED) displayArea.append(item.getText()+n);public static void main(String args)SimpleMenu
43、e=new SimpleMenu(); e.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 運(yùn)行結(jié)果如圖9-10所示。圖9-10 運(yùn)行結(jié)果 【說(shuō)明】對(duì)菜單處理可以通過(guò)菜單項(xiàng)的類型不同而展開?!纠?-8】鼠標(biāo)事件舉例。解題思路:將一個(gè)窗口的隱性層監(jiān)聽起來(lái),那么在這個(gè)隱性層上所有鼠標(biāo)操作都會(huì)觸發(fā)MouseEvent事件。代碼:程序SimpleMouse.javaimport java.awt.*;import javax.swing.*;import java.awt.event.*; public class SimpleMouse impleme
44、nts MouseListener JFrame a = new JFrame(鼠標(biāo)事件演示窗口); Container contentPane = a.getContentPane(); JLabel label = new JLabel(初始狀態(tài),JLabel.CENTER); public void go() contentPane.addMouseListener(this); contentPane.add(label); a.setSize(250,200); a.setVisible(true); public void mousePressed(MouseEvent e) la
45、bel.setText(按下鼠標(biāo)按鈕); public void mouseReleased(MouseEvent e) label.setText(釋放鼠標(biāo)按鈕); public void mouseEntered(MouseEvent e) label.setText(鼠標(biāo)光標(biāo)進(jìn)入按鈕); public void mouseExited(MouseEvent e) label.setText(鼠標(biāo)光標(biāo)離開按鈕); public void mouseClicked(MouseEvent e) label.setText(點(diǎn)擊鼠標(biāo)); public static void main(Strin
46、g args) SimpleMouse b = new SimpleMouse(); b.go(); 運(yùn)行結(jié)果如圖9-11所示。圖9-11 運(yùn)行結(jié)果 【說(shuō)明】本例程序來(lái)主要演示MouseListener監(jiān)聽器對(duì)鼠標(biāo)事件處理的情況。9.5.1標(biāo)簽9.5.2 按鈕9.5.3文本組件9.5.4 選擇組件9.5.5 組合框9.5.6列表框9.5.7菜單組件9.5.8工具欄9.5.9滾動(dòng)面板9.5.10面板9.5.11案例29.5 常用Swing組件的使用 Swing組件類一般都是J開頭。這些組件配合布局管理可以組合出豐富多彩的圖形用戶界面。這些界面再加上事件處理,就構(gòu)成了完整的用戶界面的編程。標(biāo)簽用于
47、在窗口界面上顯示一行提示性或說(shuō)明性的文字。標(biāo)簽只能顯示信息,不能用于輸入。JLabel類比較常用的方法有:String getText():獲取標(biāo)簽上的文字。void setText(String text) :設(shè)置標(biāo)簽顯示的文字為text。void setFont(Font f):設(shè)置標(biāo)簽文字的字體。9.5.1標(biāo)簽按鈕是圖形用戶界面中最常見的組件,用來(lái)控制程序運(yùn)行的方向。用戶單擊按鈕時(shí)會(huì)產(chǎn)生ActionEvent事件,計(jì)算機(jī)將相應(yīng)地執(zhí)行一系列命令完成一定功能。JButton類比較常用的方法有:void setText(String text):設(shè)置按鈕上的標(biāo)識(shí)文字為text。String g
48、etText():獲得按鈕上的標(biāo)識(shí)文字。9.5.2 按鈕1文本框是一個(gè)單行文本編輯框,用于接收用戶輸入的一行文字,也可以顯示一行文字。JTextField類比較常用的方法有:String getText():獲得文本框中的文本內(nèi)容。void setText(String text):設(shè)置文本框的文本內(nèi)容。 2文本區(qū)是一個(gè)多行文本編輯框,用于接收用戶輸入的多行文字,也可以顯示多行文字。當(dāng)文本區(qū)的內(nèi)容裝滿時(shí)不會(huì)自動(dòng)產(chǎn)生滾動(dòng)條,需要將文本區(qū)組件添加到JScrollPane(滾動(dòng)面板)上才能實(shí)現(xiàn)滾動(dòng)條效果。JTextArea類具有JTextField類的相同方法,另外其比較常用的方法還有:String
49、 getSelected():獲取被選中的文本。void append(String text):在文本區(qū)尾部添加文本text。9.5.3文本組件1單選按鈕只有“選中”和“未選中”兩種狀態(tài),通常用一組單選按鈕實(shí)現(xiàn)“多選一”的功能。在java中必須使用按鈕組類(javax.swing.ButtonGroup)實(shí)現(xiàn)將多個(gè)單選按鈕位于同一組中。注意,ButtonGroup僅僅是一個(gè)邏輯分組,不是物理分組,在Palette組件板上并不存在該組件,因此需要自行定義ButtonGroup類的對(duì)象,并調(diào)用該類的add()方法將多個(gè)JRadioButton對(duì)象一一添加到ButtonGroup類對(duì)象中。JRad
50、ioBunon類比較常用的方法有:void setSelected(booleanb):設(shè)置一個(gè)單選按鈕的狀態(tài),b為true表明選中。9.5.4 選擇組件void setText(Stringtext):設(shè)置單選按鈕上顯示的文字。boolean isSelected():返回按鈕的狀態(tài),如果是選中的則返回 true,否則返回 false。2復(fù)選框也有“選中”和“未選中”兩種狀態(tài),通常用一組復(fù)選框提供一組選項(xiàng)供用戶選擇。與單選按鈕不同的是,在一組復(fù)選框中,可以同時(shí)選中多個(gè)復(fù)選框,也可以不選中任何一個(gè)復(fù)選框。JCheckBox類比較常用的方法基本上與JRadioButton類的相同。組合框是向用戶
51、提供多種選項(xiàng)的組件,其通常的顯示形式是右邊帶有下拉箭頭的文本框??梢栽谄湮谋究蛑休斎诉x項(xiàng),也可以單擊下拉箭頭從顯示的列表中進(jìn)行選擇。默認(rèn)組合框是不能編輯的,需要通過(guò)setEditable(true)設(shè)為可編輯。JComboBox類比較常用的方法有:JComboBox():建立一個(gè)無(wú)選項(xiàng)的組合框。JComboBox(Object items):創(chuàng)建一個(gè)組合框,其中的選項(xiàng)由對(duì)象數(shù)組items決定。void addItem(Object object):通過(guò)字符串類或其他類為組合框添加選項(xiàng)。9.5.5 組合框int getSelectedIndex():獲取被選中項(xiàng)的序號(hào),從0開始,沒(méi)有選中時(shí)值為-
52、1。Object getSelectedItem():獲得被選中項(xiàng)的內(nèi)容。列表框能夠容納并顯示一組選項(xiàng),供用戶從中選擇一項(xiàng)或多項(xiàng),但不能對(duì)其進(jìn)行編輯。與文本區(qū)相似,列表框中的內(nèi)容增多時(shí)不會(huì)自動(dòng)產(chǎn)生滾動(dòng)條,也需要通過(guò)JScrollPane(滾動(dòng)面板)才能實(shí)現(xiàn)滾動(dòng)條效果。JList類比較常用的方法有:JList():創(chuàng)建一個(gè)沒(méi)有選項(xiàng)的列表框。JList(Vector vect):創(chuàng)建一個(gè)列表框,其中的選項(xiàng)由向量表vect決定。JList(Object items):創(chuàng)建一個(gè)列表框,其中的選項(xiàng)由對(duì)象數(shù)組items決定。9.5.6列表框void setSelectionMode(intselectio
53、nMode):設(shè)置列表框支持單選還是多選。void setVisibleRowCount(int visibleRowCount ):設(shè)置列表框中可顯示的行數(shù)。Object getSelectedValue():獲取被選中項(xiàng)的內(nèi)容。int getSelectedIndex(int i):獲取被選中項(xiàng)的序號(hào),從0開始,沒(méi)有選中時(shí)值為-1。void setListData(Vector listData):設(shè)置列表框中的選項(xiàng),參數(shù)是一個(gè)向量表 。 開發(fā)菜單時(shí),需要使用到3個(gè)類:MenuBar類、Menu類和MenuItem類??梢酝ㄟ^(guò)setMenuBar方法將菜單放置在容器中的任何位置。9.5.7
54、菜單組件 工具欄按鈕一般對(duì)應(yīng)著菜單中的某一項(xiàng),便于用戶進(jìn)行常用的操作。JToolBar提供了一個(gè)用來(lái)顯示常用的操作或控件的組件。對(duì)于大多數(shù)的外觀,用戶可以將工具欄拖到單獨(dú)的窗口中。9.5.8工具欄 滾動(dòng)面板是一個(gè)帶滾動(dòng)條的中間層容器,通常利用它為Swing組件中的文本區(qū)(JTextArea)、列表(JLIst)等組件添加滾動(dòng)條。具體操作方法:先從Palette組件板上選取一個(gè)JScrollPane組件,在設(shè)計(jì)區(qū)上畫出適當(dāng)大小的區(qū)域,然后再選取一個(gè)JTextArea或JLIst組件添加到該JScrollPane上,這樣文本區(qū)或列表框就會(huì)帶有滾動(dòng)條了。9.5.9滾動(dòng)面板 JPanel是個(gè)無(wú)邊框的中
55、間層容器,使用面板的目的是為了在窗口上分層次、分區(qū)域管理各種組件,適合比較復(fù)雜的GUI。一個(gè)窗口中可以添加多個(gè)JPanel對(duì)象,JPanel類的最常用的方法是add()方法和setLayout()方法,分別用于添加組件、設(shè)置面板布局。9.5.10面板解題思路:Swing包中的許多組件,如JCheckBox、JComboBox、JCheckBoxMenuItem,提供了“選中”和“未選”兩種狀態(tài)。希望對(duì)操作中產(chǎn)生的這兩種狀態(tài)能進(jìn)行相應(yīng)地處理屬于選項(xiàng)事件處理。與選項(xiàng)事件處理相關(guān)的有事件類ItemEvent和監(jiān)聽器接口ItemListener。代碼:SimpleRegister.javaimport
56、 java.awt.*;import javax.swing.*;import java.awt.event.*;public class SimpleRegister extends JFrame String information;JLabel gendarLabel,placeLabel,hobbyLabel;9.5.11案例2:設(shè)計(jì)一個(gè)簡(jiǎn)單的興趣投票界面,實(shí)現(xiàn)基本信息的輸入JRadioButton radio1,radio2; /定義單選按鈕ButtonGroup group; /定義按鈕組String placeName=請(qǐng)選擇,廣州,北京,上海,杭州;JComboBox plac
57、eBox; /定義組合框String hobbyName=網(wǎng)購(gòu)信息,旅游信息,新書信息,娛樂(lè)明星;JCheckBox hobbyBox; /定義復(fù)選框String gendar=,place=,hobby=;JButton confirmBtn,cancelBtn; /定義確定按鈕和取消按鈕public SimpleRegister() super(簡(jiǎn)單投票頁(yè)面); Container container=getContentPane(); container.setLayout(new FlowLayout(); gendarLabel=new JLabel(性別); radio1=new
58、JRadioButton(男); radio2=new JRadioButton(女);radio1.addItemListener(new RadioListener(); /注冊(cè)選項(xiàng)監(jiān)聽器radio2.addItemListener(new RadioListener(); /注冊(cè)選項(xiàng)監(jiān)聽器 group=new ButtonGroup(); group.add(radio1); group.add(radio2); container.add(gendarLabel); container.add(radio1); container.add(radio2); placeLabel=new
59、 JLabel(所在地); placeBox=new JComboBox(placeName); placeBox.addItemListener(new ComboListener(); /注冊(cè)選項(xiàng)監(jiān)聽器 container.add(placeLabel); container.add(placeBox); hobbyLabel=new JLabel(關(guān)注); container.add(hobbyLabel); hobbyBox=new JCheckBoxhobbyName.length; for(int i=0;ihobbyName.length;i+) hobbyBoxi=new JC
60、heckBox(hobbyNamei); hobbyBoxi.addItemListener(new CheckBoxListener(); /注冊(cè)選項(xiàng)監(jiān)聽器 container.add(hobbyBoxi); confirmBtn=new JButton(確定); cancelBtn=new JButton(取消); confirmBtn.addActionListener(new NewActionListener(); /定義事件監(jiān)聽器 cancelBtn.addActionListener(new NewActionListener(); /定義事件監(jiān)聽器 container.add(
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024特崗教師聘用及教師團(tuán)隊(duì)協(xié)作能力提升服務(wù)合同3篇
- 2025年度新能源車輛采購(gòu)及維護(hù)服務(wù)合同范本2篇
- 2025年度智能家居系統(tǒng)代理商合作協(xié)議4篇
- 2025年度新能源汽車研發(fā)出資人合作協(xié)議4篇
- 2025年度旅游景區(qū)特色商品檔口租賃經(jīng)營(yíng)合同3篇
- 2025年度水電工程安全監(jiān)測(cè)系統(tǒng)安裝與維護(hù)服務(wù)合同3篇
- 2024版食堂承包合同協(xié)議范文
- 2025年度特殊崗位人員辭退及安置協(xié)議范本4篇
- 2025年度智能機(jī)器人研發(fā)股權(quán)合作協(xié)議4篇
- 2025年度文化產(chǎn)業(yè)園區(qū)運(yùn)營(yíng)管理合同3篇
- 小學(xué)數(shù)學(xué)六年級(jí)解方程練習(xí)300題及答案
- 電抗器噪聲控制與減振技術(shù)
- 中醫(yī)健康宣教手冊(cè)
- 2024年江蘇揚(yáng)州市高郵市國(guó)有企業(yè)招聘筆試參考題庫(kù)附帶答案詳解
- 消費(fèi)醫(yī)療行業(yè)報(bào)告
- 品學(xué)課堂新范式
- GB/T 1196-2023重熔用鋁錠
- 運(yùn)輸行業(yè)員工崗前安全培訓(xùn)
- 公路工程安全風(fēng)險(xiǎn)辨識(shí)與防控手冊(cè)
- 幼兒園教師培訓(xùn):計(jì)數(shù)(數(shù)數(shù))的核心經(jīng)驗(yàn)
- 如何撰寫和發(fā)表高水平的科研論文-good ppt
評(píng)論
0/150
提交評(píng)論