chap06 GUI 編程.ppt_第1頁
chap06 GUI 編程.ppt_第2頁
chap06 GUI 編程.ppt_第3頁
chap06 GUI 編程.ppt_第4頁
chap06 GUI 編程.ppt_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第6章,GUI 編 程,本章主要內容,6.1 Swing起步 6.2 AWT事件處理 6.3 布局管理 6.4 常用GUI組件,6.1 Swing起步,6.1.1 Swing概述 6.1.2 一個GUI實例 6.1.3 面板 6.1.4 改變應用程序的觀感,6.1.1 Swing概述,在Java 1.0中,已經(jīng)有一個用于GUI編程的類庫AWT(Abstract Window Toolkit),稱之為抽象窗口工具箱。 1996年,Sun公司和Netsacpe公司在一個稱為Swing的項目中合作完善了Netsacpe公司原來開發(fā)的一套GUI庫,也就是現(xiàn)在所謂的Swing組件。 JFC的概念是在19

2、97年的JavaOne開發(fā)者大會上首次提出的,是指用于構建GUI的一組API。實際上,Swing只是JFC的一部分,其他的還有二維圖形(Java 2D)API以及拖放(Drag and Drop)API等。,6.1.2 一個GUI實例,這個應用程序很簡單,只是在屏幕上顯示一個框架組件(JFrame) 。這種框架組件是一種頂層(Top-Level)容器,在Swing組件中還有其他3種頂層容器:JWindow、JDialog和JApplet。 如果希望上面的程序在單擊框架的關閉按鈕后,應用程序退出,可以添加如下語句: f.setDefaultCloseOperation(JFrame.EXIT_O

3、N_CLOSE);,6.1.3 面板,JPanel本身也是一個容器,可以向其中添加其他GUI組件(如按鈕JButton);但是JPanel不是頂層容器,因此,要在屏幕上顯示JPanel,必須將它添加到一個頂層容器(如JFrame)中。JPanel還具備在自身表面繪制圖形的功能,可以通過定制的方式在面板表面繪制各種圖形。 1. 作為容器 面板作為容納其他Swing組件的容器是JPanel最常使用的功能之一。在制作復雜的用戶界面時,常常需要使用多個JPanel將復雜的界面分解為相對較簡單的子界面,然后再對每個JPanel進行布局。 下面來看一個將面板作為容器使用的例子。這個例子中分為兩步。 (1)

4、將一個標簽和一個文本框添加到面板中。 (2)再將面板添加到框架中,然后顯示框架。,程序代碼,運行結果:,2. 表面重繪,當一個組件需要進行重繪時,事件處理器會通知該組件,從而引起組件paintComponent(Graphics g)方法的自動調用。 用戶永遠不需要直接調用該方法。如果用戶要求主動發(fā)起組件的重繪,可以調用repaint()方法通知組件需要重繪,從而實現(xiàn)paintComponent(Graphics g)方法的自動調用。 paintComponent(Graphics g)方法需要的一個圖形參數(shù)Graphics也是由系統(tǒng)自動傳遞進來的。 Graphics類型的對象中存儲了用于繪制

5、圖形和文本的設置集合(如字體、顏色)以及繪制圖形和文本的工具。 可以通過覆蓋(Override)組件的paintComponent(Graphics g)方法,在組件表面繪制出我們所希望的內容。,程序代碼,運行結果:,6.1.4 改變應用程序的觀感,可以用下面的程序片段將應用程序設定為Windows觀感: 通常,我們會在程序一開始運行時就設定好觀感。但是有的時候,可能會在程序的運行過程中(Swing組件已經(jīng)顯示出來)要求動態(tài)改變觀感。這時候,在使用UIManager.setLookAndFeel(lnfName)語句設定完觀感后,還必須使用SwingUtilities.updateCompon

6、entTreeUI()語句來更新所有的已顯示組件的觀感。動態(tài)改變應用程序觀感的一般代碼框架可以是: UIManager.setLookAndFeel(lnfName); /設定觀感 /更新容器frame內的所有組件的觀感 SwingUtilities.updateComponentTreeUI(frame);,6.2 AWT事件處理,6.2.1 事件處理簡介 6.2.2 事件處理實例 6.2.3 使用事件適配器 6.2.4 AWT事件繼承關系,6.2.1 事件處理簡介,用戶對應用程序進行操作時會產生事件(Event),例如:單擊按鈕會產生一個動作(Action)事件。 在Java中,事件被封裝

7、成一個對象,該對象中包含了和事件相關的信息,如事件源、事件類型等。 給事件源注冊事件偵聽器,可使用該事件源中的addXXXListener(aXXXListener)方法。依據(jù)事件類型的不同,注冊的方法名也不同。例如給按鈕注冊一個動作事件偵聽器: aButton.addActionListener(aActionListener);,6.2.2 事件處理實例,實例中提供了一個按鈕,單擊該按鈕可以使得應用程序在Windows和Metal觀感之間進行切換,下圖顯示了運行過程中兩種不同的觀感。,6.2.3 使用事件適配器,任何實現(xiàn)了WindowListener接口的類所生成的對象均可以注冊到窗口事件

8、源。由于WindowListener接口中包含了如下的7個方法: public interface WindowListener void windowActivated(WindowEvent e); void windowClosed(WindowEvent e); void windowClosing(WindowEvent e); void windowDeactivated(WindowEvent e); void windowDeiconified(WindowEvent e); void windowIconified(WindowEvent e); void windowOpe

9、ned(WindowEvent e); 因此,一個類要實現(xiàn)WindowListener接口,就必須實現(xiàn)該接口中的所有7個方法。,6.2.4 AWT事件繼承關系,AWT事件模型中的每個事件類都是java.util.EventObject類的擴展。AWTEvent直接繼承了EventObject,同時AWTEvent又是所有AWT事件類的父類。,AWT事件模型中共提供了14個事件偵聽器接口,其中有7個偵聽器接口的方法不止一個,因而提供了7個相應的適配器類。,6.3 布 局 管 理,6.3.1 流式布局 6.3.2 邊框布局 6.3.3 網(wǎng)格布局 6.3.4 網(wǎng)格袋布局,6.3.1 流式布局,面板的

10、默認布局管理器是FlowLayout。 FlowLayout 類提供了3種構建器public FlowLayout()、public FlowLayout(int alignment)和public FlowLayout(int alignment、int horizontalGap、int verticalGap)。 alignment參數(shù)可以取值FlowLayout.LEFT、FlowLayout.CENTER或是FlowLayout.RIGHT,用于指定組件在一行上的對齊方式。horizontalGap和verticalGap分別表示組件在水平和垂直方向上的間距(以像素為單位)。 默認情

11、況下,alignment取值為FlowLayout.CENTER,horizontalGap和verticalGap均取值為5。,6.3.2 邊框布局,GUI組件要在屏幕上顯示,最終必須被添加到一個頂層容器中。 內容窗格的默認布局管理器是邊框布局(BorderLayout)。 不僅是內容窗格,任何使用了BorderLayout布局的容器均提供5個位置用于存放組件,分別是North、South、East、West以及Center,例,6.3.3 網(wǎng)格布局,網(wǎng)格布局(GridLayout)將容器劃分為大小相同的網(wǎng)格,把GUI組件向使用了網(wǎng)格布局的容器中添加時,是按照自左向右,自上而下的位置存放的。

12、 GridLayout類提供了兩個構建器: public GridLayout(int rows, int columns) public GridLayout(int rows, int columns,int horizontalGap, int verticalGap) rows和columns分別指定劃分網(wǎng)格的行數(shù)及列數(shù)。horizontalGap和verticalGap用于指定組件在水平和垂直方向上的間隔,默認情況下均為0。,6.3.4 網(wǎng)格袋布局,網(wǎng)格袋布局也是將用戶界面劃分為若干個網(wǎng)格(Grid),不同之處在于: 網(wǎng)格袋布局中的每個網(wǎng)格的寬度和高度都可以不一樣。 每個組件可以占據(jù)

13、一個或是多個網(wǎng)格。 可以指定組件在網(wǎng)格中的??课恢?。 當將一個GUI組件添加到使用了網(wǎng)格袋布局的容器中時,需要指定該組件的位置、大小以及縮放等一系列約束條件。可以使用一個GridBagConstraints類型的對象來存儲這些約束條件。,向使用網(wǎng)格袋布局的容器中添加組件的代碼框架如下: JPanel p=new JPanel(); JTextField txtField=new JTextField(); p.setLayout(new GridBagLayout();/容器p設置為網(wǎng)格袋布局 /創(chuàng)建約束條件對象 GridBagConstraints constraints=new GridB

14、agConstraints(); /設置具體的約束條件 . /按照約束條件constraints將txtField添加到p中 p.add(txtField, constraints);,例:在一個面板上按照下圖所示排列組件;此外,我們還希望面板上的標簽在面板縮放時,大小不改變;文本框在面板縮放時,在水平方向上能夠相應地縮放,而在垂直方向上大小不改變。 首先,在面板上按照組件排列的需要劃分網(wǎng)格 然后對行和列從0開始編號。 對于要添加到該面板中的組件,需要有一個GridBagConstraints 類型的約束條件對象constraints。,6.4 常用GUI組件,6.4.1 標簽 6.4.2 文

15、本輸入類組件 6.4.3 選擇類組件 6.4.4 菜單類組件 6.4.5 對話框 6.4.6 表格,6.4.1 標簽,標簽(JLabel)通常是用來標識另外一個組件的含義。 如下圖所示??梢栽跇撕炆巷@示文字、圖像或是文字圖像的組合。,創(chuàng)建一個只顯示文字的標簽對象,可以使用: JLabel labText=new JLabel(文本標簽); 也可以在標簽對象生成后,調用標簽對象中的setText()方法來設置標簽上顯示的內容: labText.setText(文本標簽); 如果希望在標簽上顯示圖像,可以先創(chuàng)建一個圖像對象,然后將該對象作為標簽的構建器參數(shù): ImageIcon icon = ne

16、w ImageIcon(image/greenflag20.gif); JLabel labImage=new JLabel(icon); 也可以在標簽對象生成后,調用其中的setIcon方法來設置標簽上顯示的圖像: labImage.setIcon(aIcon); /aIcon是一個ImageIcon類型的對象,如果要在標簽上同時顯示文本和圖像,可以使用JLabel提供的一個構建器Jlabel (String text、Icon icon、int horizontalAlignment)。該構建器中,第一個參數(shù)是欲顯示的文本,第二個參數(shù)是欲顯示的圖像,第三個參數(shù)為水平方向上的對齊方式,取值為

17、:SwingConstants.LEFT、SwingConstants.RIGHT或SwingConstants. CENTER。 標簽上同時顯示文本和圖像時,在默認情況下,文字將顯示在圖像的右側。如果希望文字顯示在圖像的左側,可以使用如下方法: labTextImage.setHorizontalTextPosition(SwingConstants.LEFT); 標簽還支持使用HTML類型的文本參數(shù),使用HTML可以方便地在標簽上顯示豐富多彩的文本。,6.4.2 文本輸入類組件,Java提供了一系列的組件用于接收用戶的文本輸入,并且用戶可以對輸入的文本進行編輯,例如:文本框、密碼框、文本域

18、以及可編輯的組合框等。 當輸入的文本量比較少時,可以使用文本框; 需要輸入大量的文本時,使用文本域比較方便。 當向密碼框中輸入文本時,實際的輸入文本并不在密碼框中顯示,而是使用特殊的回顯字符(通常是*)加以顯示。 組合框中通常預先設置了一些候選的文本串,用戶可以方便地選擇合適的文本。當候選的文本串均不合適時,在可編輯狀態(tài)下,用戶可以向組合框中輸入文本,這也是把可編輯的組合框分類到文本輸入類組件的原因。對于不可編輯的組合框,可以歸類為選擇類組件。,1. 文本框,用戶可以在文本框中輸入單行文本并進行編輯。下面的代碼生成了一個文本框對象: JTextField txtA=new JTextField

19、(); 在生成一個文本框對象時初始化文本框中的文本內容: JTextField txtA=new JTextField(abc); 指定文本框的列寬度: JTextField txtA=new JTextField(20); 同時指定初始文本內容與列寬度: JTextField txtA=new JTextField(abc,20);,2. 密碼框,密碼框實際上是一種特殊類型的文本框,用戶可以向其中輸入文本并加以編輯。和文本框不同的是,向密碼框中輸入文本時,顯示的不是實際輸入的文本,而是特殊的回顯字符(通常是*)??梢允褂胹etEchoChar(char c)方法來改變默認的回顯字符。 需要注

20、意的是,取得文本框中的文本時,使用方法getText(),該方法返回的是一個String類型的對象;而要取得密碼框中的文本,使用方法getPassword(),該方法返回的是一個char數(shù)組。,3. 文本域,文本域允許用戶在其中輸入多行文本并進行編輯。創(chuàng)建一個文本域對象: JTextArea txtArea=new JTextArea(); 還可以在創(chuàng)建時指定文本域的行數(shù)和列數(shù): JTextArea txtArea=new JTextArea(10,30); 當輸入的文本到達列邊界后,不會自動換行;雖然可以繼續(xù)輸入文本,但是超出顯示范圍的部分將變得不可見??梢杂袃煞N方法解決換行問題:一種是可以

21、使用文本域對象的setLineWrap(true)方法來將文本域設置為自動換行;另一種是在快要到達顯示邊界時,按下Enter鍵進行硬換行。,給文本域加上滾動條 JFrame f=new JFrame(); JTextArea t=new JTextArea(); JScrollPane scroll=new JScrollPane(t); f.getContentPane().add(scroll);,4. 組合框,組合框可以以兩種模式工作:可編輯模式與不可編輯模式。在默認情形下,組合框處于不可編輯的模式。 在不可編輯模式下,用戶單擊組合框后,組合框會提供一個選項列表供用戶選擇,并且用戶只能從

22、該選項列表中選擇一項作為組合框的輸入。 在可編輯模式下,一方面用戶可以從選項列表中選擇,另一方面還可以直接在組合框中輸入并進行編輯。,6.4.3 選擇類組件,1. 單選按鈕 單選按鈕(JRadioButton)通常成組(Group)使用,即若干個單選按鈕構成一組,并且每次只能有一個按鈕被選中,適用于從多個備選選項中選擇一項的場合。從完成的功能來看,類似于不可編輯的組合框。,在實際使用時,先生成一組單選按鈕,例如: JRadioButton radMSSQL=new JRadioButton(MS SQL Server); JRadioButton radOracle=new JRadioBut

23、ton(ORACLE Server); JRadioButton radMysql=new JRadioButton(MySQL Server); 然后生成一個按鈕組(ButtonGroup)對象,并將這些單選按鈕添加到其中: ButtonGroup group=new ButtonGroup(); group.add(radMSSQL); group.add(radOracle); group.add(radMysql); 添加到同一個按鈕組中的單選按鈕每次只能有一個被選中,并且當一個新按鈕被選中時,原來被選中的按鈕將被置為未選中狀態(tài)。,2. 復選框,復選框是一種二狀態(tài)的GUI組件:重復單擊

24、同一個復選框,會在選中和未選中這兩種狀態(tài)之間進行切換。一組復選框中可以同時有多個復選框被選中。,下面的這條語句生成一個復選框對象,其中的字符串參數(shù)用以表示該復選框的含義: JCheckBox chkOperation=new JCheckBox(清空操作記錄); 要判斷一個復選框是否被選中,可使用方法isSelected()。如果返回值是true,表示選中;若返回值為false,表示未選中。還可以使用setSelected(boolean aValue)方法設定復選框是否被選中,參數(shù)aValue為true(false)時設定為選中(未選中)。,3. 列表框,列表框(JList)將一組選項以列表

25、的方式提供給用戶選擇。根據(jù)列表框所設定的性質不同,用戶可以同時選擇一個或是多個選項。下面的兩行代碼生成了一個列表框對象: Object employee= Tom Hanks,Bob,Jack London,Sindy, Mike,Lizz,Jerrey; JList lstEmployee=new JList(employee); 數(shù)組employee中的元素將作為列表框lstEmployee的選項供用戶選擇。,列表框共有3種選中模式,如下表所示。,6.4.4 菜單類組件,菜單也是一種常用的GUI組件。它是一種層次結構,最頂層是菜單欄(JMenuBar),在菜單欄中可以添加若干個菜單(JMe

26、nu),每個菜單中又可以添加若干個菜單選項(JMenuItem)、分隔線(Separator)或是菜單(稱之為子菜單)。,構建應用程序的菜單時,先創(chuàng)建一個菜單欄: JMenuBar menuBar=new JMenuBar(); 通常使用框架的setJMenuBar(JMenuBar aMenuBar)方法將菜單欄置于框架中: frame.setJMenuBar(menuBar); 隨后,創(chuàng)建所需要的各菜單并逐個添加到菜單欄中 最后,向各個菜單中添加菜單選項、分隔線或是子菜單。 當單擊一個菜單選項時,會生成一個動作事件(ActionEvent)。為菜單選項添加事件偵聽器就可以偵聽其動作事件。,

27、彈出式菜單,彈出式菜單(JPopupMenu)是一種特殊的菜單,和普通菜單的區(qū)別在于它不固定在菜單欄中,而是可以四處浮動的 。 下面的語句創(chuàng)建了一個彈出式菜單: JPopupMenu popup=new JPopupMenu(); 與向菜單中添加菜單選項、分隔線或是子菜單一樣,使用同樣的方法向彈出式菜單中添加內容 彈出式菜單通常是在用戶希望它出現(xiàn)的時候才在某個GUI組件(稱為彈出式菜單的父組件)上出現(xiàn),用戶可以通過單擊某個特殊的鼠標鍵(稱為觸發(fā)器)來觸發(fā)彈出式菜單。,工具條,有些菜單選項的使用頻率較高,每次使用都要打開菜單,效率較低。為此,可以在工具條(JToolBar)中提供與這些菜單選項相

28、對應的快捷按鈕,以提高用戶的使用效率。 工具條通常被置于布局為BorderLayout的容器中。 工具條還有一個特點:它可以被拖動到所在容器的其他邊界,甚至脫離它所在的容器。,生成一個工具條對象,可以使用語句: JToolBar toolbar=new JToolBar(); 還可以在生成工具條時,指明工具條的標題。這樣,當工具條脫離所在容器時,可以在自己的標題欄顯示標題: JToolBar toolbar=new JToolBar(顏色工具條); 向工具條中添加組件,使用add方法: toolbar.add(btnBlue); toolbar.add(btnYellow);,6.4.5 對話

29、框,對話框是用戶和應用程序進行交互(對話)的一個橋梁:對話框可以用于收集用戶的輸入數(shù)據(jù)傳遞給應用程序,或是顯示應用程序的運行信息給用戶。 對話框分為模式(modal)和非模式兩種。模式對話框處于可見狀態(tài)時,用戶將不能與應用程序的其他窗口進行交互,而非模式對話框則沒有此限制。 Java中提供了一個類JOptionPane用于創(chuàng)建簡單的模式對話框,如果希望創(chuàng)建非模式對話框或是自定義對話框可以使用JDialog。,1. 選項對話框,JOptionPane類中提供了4種靜態(tài)方法,用以顯示4種常用的對話框。 showMessageDialog:消息對話框。 showInputDialog:輸入對話框。

30、showConfirmDialog:確認對話框。 showOptionDialog:選項對話框。,2. 自定義對話框,使用JOptionPane創(chuàng)建的對話框均為模式對話框,而且JOptionPane只適用于創(chuàng)建相對簡單的對話框。當需要創(chuàng)建非模式對話框或是復雜對話框的時候,就需要使用JDialog。 繼承JDialog可以方便地構建出復雜的模式或是非模式對話框。,3. 文件對話框,Java中提供了文件對話框JFileChooser用于定位文件。 創(chuàng)建一個文件對話框,可以使用語句: JFileChooser chooser=new JFileChooser(); 使用上述語句所創(chuàng)建的文件對話框的當前目錄為用戶home目錄。

溫馨提示

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

評論

0/150

提交評論