Java程序設(shè)計基礎(chǔ) 課件 (羅剛)第11章 圖形界面設(shè)計、第12章 事件處理_第1頁
Java程序設(shè)計基礎(chǔ) 課件 (羅剛)第11章 圖形界面設(shè)計、第12章 事件處理_第2頁
Java程序設(shè)計基礎(chǔ) 課件 (羅剛)第11章 圖形界面設(shè)計、第12章 事件處理_第3頁
Java程序設(shè)計基礎(chǔ) 課件 (羅剛)第11章 圖形界面設(shè)計、第12章 事件處理_第4頁
Java程序設(shè)計基礎(chǔ) 課件 (羅剛)第11章 圖形界面設(shè)計、第12章 事件處理_第5頁
已閱讀5頁,還剩159頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第十一章圖形界面設(shè)計11.1Java圖形界面設(shè)計簡介11.2AWT概述11.3Swing概述11.4JFrame窗口11.5常用窗口組件11.6布局管理本章小結(jié)

11.1Java圖形界面設(shè)計簡介

圖形用戶界面(GraphicsUserInterface,GUI)設(shè)計,主要是指使用各種窗口界面組件進(jìn)行窗口程序設(shè)計,將程序中的數(shù)據(jù)以窗口的方式呈現(xiàn)給用戶,同時用戶也可以使用鍵盤、鼠標(biāo)等設(shè)備通過窗口的組件與程序進(jìn)行交互,如輸入數(shù)據(jù)、點擊按鈕、選擇菜單等。

圖形界面的設(shè)計使得程序與用戶之間具有更強的交互性,相對于以前在命令窗口下使用各種命令進(jìn)行交互具有很大的優(yōu)勢,也是目前桌面程序的主流方式。例如電腦上常用的記事本、Office、IDE等,都是使用圖形界面設(shè)計方式開發(fā)的桌面窗口程序軟件。再如Windows操作系統(tǒng)下的計算器就是一個典型的窗口程序,它有窗口的各種組件(窗口標(biāo)題、窗口按鈕、菜單及菜單選項、計算按鈕等等),可以通過鍵盤輸入、鼠標(biāo)點擊的方式方便地在該窗口界面下完成計算功能,如圖11-1所示。

圖11-1計算器桌面程序

計算器這個桌面程序是怎么設(shè)計和開發(fā)出來的呢?這主要涉及以下三個問題:

(1)窗口使用哪些窗口組件及組件屬性如何設(shè)置?

(2)這些組件在窗口中是怎么布局的?

(3)窗口組件如何響應(yīng)各種事件(如鍵盤輸入、鼠標(biāo)點擊等)?

本章主要涉及前兩個問題,即窗口組件以及組件在窗口中的布局;最后一章將涉及第三個問題,即如何讓這些窗口組件能夠響應(yīng)各種事件動作。

Java語言提供了兩個用以完成GUI程序設(shè)計的包,即java.awt包和javax.swing包,這些包提供的相關(guān)類能夠幫助程序員完成窗口編程。

11.2AWT概述

java.awt包中的相關(guān)類能夠完成窗口的界面設(shè)計,包括窗口組件、組件布局、事件處理等等。該包下主要包含兩個基類,即Component(組件)和MenuComponent(菜單組件),而除了這兩個基類及其子類之外,還有一些窗口輔助類(如字體、顏色和事件等)。

(1)?Component類層次結(jié)構(gòu)如圖11-2所示。圖11-2AWT下的Component類層次結(jié)構(gòu)

Component組件類是構(gòu)成窗口的圖形界面元素,也稱為窗口組件類,使用這些類能夠構(gòu)建出窗口界面,主要如下:

①Container:容器類(具有各種容器子類);

②Button:按鈕類(具有各種按鈕子類);

③Checkbox:復(fù)選框;

④List:文本列表;

⑤Label:標(biāo)簽;

⑥TextComponent:文本編輯組件(TextField、Password、TextArea等)。

(2)?MenuComponent類層次結(jié)構(gòu)如圖11-3所示。圖11-3AWT下的MenuComponent類層次結(jié)構(gòu)

抽象類MenuComponent是所有與菜單相關(guān)的組件的超類,其下的兩個類MenuBar菜單欄和MenuItem菜單選項,用于構(gòu)建窗口的菜單。

上述(1)、(2)這些AWT下的窗口組件類,在Swing包中基本都有對應(yīng)的組件類?,F(xiàn)在的窗口編程基本不再使用java.awt包中的這些組件類,而使用javax.swing包中對應(yīng)的組件,如AWT中的Button、Checkbox、List、Label、MenuBar、MenuItem等類,在Swing包中對應(yīng)的是JButton、JCheckbox、JList、JLabel、JMenuBar、JMenuItem等。

(3)?AWT包中還有一些其它的輔助類,如圖11-4所示。圖11-4AWT下的其它輔助類

在使用Java進(jìn)行窗口界面設(shè)計時,窗口組件主要使用javax.swing包中的類,但是對于java.awt包中這些輔助類,在Swing中并沒有新的類替代,因此還需要使用它們,主要如下:

①Layout:各種布局管理器類(如FlowLayout、BorderLayout等);

②Font:字體類;

③Color:顏色類;

④Image :圖形圖像類的超類;

⑤Event:事件類;

⑥Graphics:繪圖類。

11.3Swing概述

Swing提供許多比AWT更好的窗口界面組件,這些組件是用Java實現(xiàn)的輕量級(light-weight)組件,沒有本地代碼,不依賴操作系統(tǒng)的支持,這也是它與AWT組件的最大區(qū)別。Swing在不同的平臺上表現(xiàn)一致,并且有能力提供本地窗口系統(tǒng)不支持的其它特性。Swing組件采用了MVC的設(shè)計模式(Model-View-Control),設(shè)計更合理,功能更強大。

Swing的常用組件主要分為以下幾類:

(1)容器類:能夠容納其它窗口組件的組件。

①頂級容器:JFrame、JDialog、JApplet、JWindow。

②中間容器:JPanel、JScrollPane、JToolBar、JSplitPane。

(2)基本組件。

①按鈕組件:JButton、JRadioButton、JCheckBox。

②標(biāo)簽組件:JLabel。

③文本組件:JTextField、JPasswordField、JTextArea。

④列表組件:JComboBox、JList。

⑤菜單組件:JMenuBar、JMenu、JMenuItem、JToolBar。

(3)復(fù)雜組件。

①文件選擇:JFileChooser。

②顏色選擇:JColorChooser。

③樹形組件:JTree。

④表格組件:JTable。

以上也只是列出了Swing的一部分較常用的組件類,前面說過Swing只是在窗口組件方面提供了更加強大、豐富的GUI組件,并不能完全替代AWT。從命名上可以看出,Swing組件和對應(yīng)的AWT組件只是差了一個首字母J,但也有幾個命名例外,如:

JComboBox:下拉列表組件,對應(yīng)AWT中的Choice組件。

JFileChooser:文件選擇器組件,對應(yīng)AWT中的FileDialog組件。

Swing頂級容器類層次結(jié)構(gòu)如圖11-5所示。圖11-5Swing頂級容器類層次結(jié)構(gòu)

Swing中間容器以及組件類層次結(jié)構(gòu)(部分)如圖11-6所示。圖11-6Swing中間容器以及組件類層次結(jié)構(gòu)

11.4JFrame窗口JFrame稱為窗口框架,是帶標(biāo)題欄并且可以改變大小的窗口,一般使用它來構(gòu)建桌面應(yīng)用程序的窗口。JFrame類繼承自java.awt.Frame類,其對象作為獨立可運行的主窗口,通常用于開發(fā)桌面應(yīng)用程序,通過JFrame對象的方法可以設(shè)置主窗口的菜單欄、工具欄、狀態(tài)欄、窗口大小、窗口圖標(biāo)、窗口的各種屬性以及在主窗口中添加其它窗口組件等。JFrame默認(rèn)的布局管理器是BorderLayout,通過setLayout方法可改變默認(rèn)的布局管理器,而添加到主窗口的組件的位置和大小可以由布局管理器決定。

程序結(jié)果:

(2)在設(shè)置位置和大小的時候,使用的單位是像素,屏幕左上角的XY坐標(biāo)為(0,0),從左向右X坐標(biāo)增加,從上向下Y坐標(biāo)增加,如圖11-7所示。圖11-7窗口大小與位置

(3)?setLayout用于設(shè)置窗口的布局管理器,該函數(shù)的參數(shù)為布局管理器對象,用以對窗口容器進(jìn)行布局,現(xiàn)在暫時不用布局管理器,故設(shè)置為空null。

(4)“setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);”用于設(shè)置何時進(jìn)行關(guān)閉窗口(點擊窗口右上角的關(guān)閉按鈕)的操作。望文生義,JFrame.EXIT_ON_CLOSE是在關(guān)閉窗口時退出程序,EXIT_ON_CLOSE是JFrame的字段。

(5)程序運行到“fr.setVisible(true);”語句時,窗口就在屏幕上顯示出來。

上面程序是在main函數(shù)中直接產(chǎn)生一個JFrame的對象,然后對該對象進(jìn)行設(shè)置,最后顯示出窗口,還可以使用繼承的結(jié)構(gòu)方式來生成窗口。

JFrame其它的一些常用方法如表11-1所示。

JFrame關(guān)閉窗口的字段如表11-2所示。

11.5常用窗口組件

11.5.1標(biāo)簽在窗口中需要顯示文字或者圖像圖片時,首先使用JLabel(javax.swing.JLabel)標(biāo)簽對象來承載文字和圖像,然后將JLabel標(biāo)簽添加到窗口容器中。

1.JLabel的構(gòu)造函數(shù)

可以通過不同的構(gòu)造函數(shù)來讓JLabel承載文本和圖像,JLabel的構(gòu)造函數(shù)如表11-3所示。

2.JLabel的常用方法

JLable的常用方法如表11-4所示。

程序結(jié)果:

11.5.2字體、顏色與圖像

1.字體(java.awt.Font)

要對窗口組件的文字設(shè)置字體,可以使用java.awt.Font類,一般需要兩個步驟:

(1)創(chuàng)建字體對象:

Fontfont=newFont("字體名",字體樣式,字體大小);

(2)讓字體對象與組件進(jìn)行“綁定”:

組件對象.setFont(font);

首先,生成字體對象,上述Font構(gòu)造函數(shù)需要三個參數(shù):

①字體名:字體名和計算機系統(tǒng)中的字體文件相對應(yīng),字體文件一般存放在C盤的Windows目錄的font目錄中。

②字體樣式:使用Font字段的方式來表示,即Font.PLAIN(普通樣式)、Font.BOLD(字體加粗)、Font.ITALIC(傾斜)等。

③字體大小:使用字體磅值來表示。

其次,對于能夠承載文字的組件使用setFont方法,將Font對象傳入該方法即可根據(jù)字體對象的設(shè)置改變組件上的文字字體:

組件對象.setFont(字體對象);

2.顏色(java.awt.Color)

對組件顏色的設(shè)置主要使用java.awt.Color類,在程序中顏色的表示主要有兩種方式:

(1)直接使用Color類調(diào)用其靜態(tài)成員字段來表示某種顏色,例如Color.Red(紅色)、Color.Blue(藍(lán)色)、Color.DARK_GRAY(深灰)、Color.LightGray(淺灰),具體Color類還有哪些預(yù)定義的顏色,可以查詢JDK幫助文檔,這里不再贅述。

(2)定義一個Color對象,對該對象的顏色屬性進(jìn)行設(shè)置。Color類用得比較多的是具有三個int參數(shù)的構(gòu)造函數(shù),這三個int參數(shù)取值為0~255,表示RGB顏色數(shù)值,即紅、綠、藍(lán),可根據(jù)這三種顏色數(shù)值的變化來表示各種顏色。例如newColor(0,0,0)表示黑色,newColor(255,255,255)表示白色,newColor(255,0,0)表示紅色,newColor(255,255,0)表示黃色,newColor(128,42,42)表示棕色等。

3.圖像圖標(biāo)(javax.swing.ImageIcon)

如果要將磁盤上的圖像文件顯示到窗口中,可以使用javax.swing.ImageIcon圖像圖標(biāo)類生成對象,然后將該對象設(shè)置到JLabel中,再將JLabel對象加入到窗口中,具體分為下面幾個步驟:

(1)根據(jù)磁盤圖像文件名生成圖像圖標(biāo)類對象:

ImageIconimageIcon=newImageIcon("star.png");

(2)將圖像圖標(biāo)對象設(shè)置到JLabel對象中:

JLabellabel1=newJLabel(imageIcon); //使用構(gòu)造函數(shù)方式

label1.setIcon(imageIcon); //使用set方法

(3)將上述設(shè)置好的JLabel對象添加到窗口中。

4.圖像(java.awt.Image)

在java.awt下還有一個Image抽象類,它是表示圖形圖像所有類的超類。生成Image對象時需要借助于Toolkit類對象的getImage方法,而生成Toolkit對象有兩種方法,一是借助于Component類的getToolkit()方法;二是借助于Toolkit的靜態(tài)方法getDefaultToolkit()。所以生成Image對象的程序語句為

Imageimage=getToolkit().getImage("a.png");

Imageimage=newToolkit.getDefaultToolkit().getImage("a.png");

11.5.3面板

JPanel(javax.swing.JPanel)稱為面板,是一種沒有標(biāo)題欄、邊框的中間層容器,可以理解為一層透明的“紙”。將組件或其它面板先加入到JPanel中,然后再將JPanel放置到頂級容器JFrame或者其它容器中,這樣可以完成較為復(fù)雜的窗口界面設(shè)計,其主要方法如表11-5所示。

程序結(jié)果:

11.5.4按鈕

1.命令按鈕

JButton(javax.swing.JButton)命令按鈕是用戶進(jìn)行交互最為常用的組件之一,用戶可以使用鼠標(biāo)點擊來完成交互動作。與JLabel組件類似,可以對JButton按鈕對象進(jìn)行各種設(shè)置,并加入到容器中。下面是對按鈕進(jìn)行設(shè)置的部分方法:

①setText:設(shè)置文本。

②setIcon:設(shè)置按鈕圖像。

③setBackground:設(shè)置背景色。

④setForeground:設(shè)置前景色(如:按鈕上文本的顏色)。

⑤setBounds:設(shè)置按鈕的位置與大小。

⑥setFont:設(shè)置按鈕上文本的字體。

⑦setPressedIcon:設(shè)置按鈕按下時的圖標(biāo)。

⑧setRolloverIcon:設(shè)置鼠標(biāo)經(jīng)過按鈕時的圖標(biāo)。

⑨setHorizontalAlignment:設(shè)置水平對齊方式。

⑩setVerticalAlignment :設(shè)置垂直對齊方式。

另外,get方法可用來獲取按鈕信息:

①getText:獲取按鈕上的文本。

②getIcon:獲取按鈕上的圖像圖標(biāo)。

③getPressedIcon:獲取按鈕按下時的圖標(biāo)。

④getRolloverIcon :獲取鼠標(biāo)經(jīng)過按鈕時的圖標(biāo)。

程序結(jié)果:

2.復(fù)選框和單選按鈕

復(fù)選框(多選按鈕)和單選按鈕用于讓用戶選取指定的項目,通過鼠標(biāo)單擊操作可設(shè)置組件的狀態(tài)是“選中”還是“未選中”。

(1)復(fù)選框(javax.swing.JCheckBox):可以單獨使用,表示多個項目是否被選擇,如多項選擇題的多選答案。

(2)單選按鈕(javax.swing.JRadioButton):一般需要配合javax.swing.ButtonGroup類來使用,將多個單選按鈕放在一個按鈕組里,從而實現(xiàn)多個單選項只能選擇一個,如選擇題中的四選一答案。

程序結(jié)果

11.5.5文本組件

在圖形界面中,文本框是用戶輸入文本信息的組件。在Swing組件中,文本框包括以下三類:

(1)單行文本框(javax.swing.JTextField):只能輸入單行文本字符串。

(2)多行文本框(javax.swing.JTextArea):可以輸入多行文本字符串。

(3)密碼框(javax.swing.JPasswordField):可輸入單行文本,輸入的字符串會被其它字符屏蔽(如*)。

程序結(jié)果:

JTextField、JTextArea兩個類都繼承自javax.swing.text.JTextComponent類,而JPasswordField類繼承自JTextField類,它們的常用方法如表11-6、表11-7所示。

11.5.6下拉列表

JComboBox(javax.swing.JComboBox)類是Swing中的下拉菜單組件,使用它能選中其下拉列表中的一個項目Item,它的各個選項的選擇是互斥的,比單選按鈕節(jié)省空間。可以使用addItem方法來添加選項,或者使用insertItemAt在指定位置插入選項。如果使用該類對象的setEditable方法設(shè)置為true,則下拉菜單的選項文本就可以編輯,這種組件也被稱為組合框。

程序結(jié)果:

11.5.7菜單

窗口程序一般都會有菜單工具為用戶的操作提供導(dǎo)航,方便用戶利用菜單提供的選項來完成相應(yīng)的功能。菜單主要分為兩類,即窗口菜單和彈出菜單。下面將介紹一般的窗口菜單。

Java語言中的菜單組件主要由菜單欄(javax.swing.JMenuBar)、菜單(javax.swing.JMenu)和菜單項(javax.swing.JMenuItem)三部分組成。窗口具有一個菜單欄JMenuBar,菜單欄具有多個菜單JMenu,每個菜單可以有多個菜單項JMenuItem。

程序結(jié)果:

11.6布局管理

Java中的布局管理主要有兩種:(1)絕對布局:不需要布局管理器,直接對每個組件設(shè)置位置和大小,然后將組件加入到相應(yīng)的容器中。(2)布局管理器(Layout):采用Java定義好的布局管理器類來對容器中組件進(jìn)行布局管理,主要有流式布局管理器(FlowLayout)、邊界布局管理器(BorderLayout)、網(wǎng)格布局管理器(GridLayout)、網(wǎng)格包布局管理器(GridbagLayout)和盒子布局管理器(BoxLayout)等。

11.6.1絕對布局

絕對布局是指容器中的所有組件的大小和位置都是相對容器的X、Y坐標(biāo)進(jìn)行設(shè)置,也就是說每個組件都要設(shè)置大小、位置,而當(dāng)窗口被拉伸時,這些組件的大小和位置不會變化。絕對布局方式適合于較小的窗口界面,并且窗口大小一般設(shè)置為不可改變,比如一個小的登錄界面等,但其缺點也是比較明顯的:

(1)每個組件都需要進(jìn)行大小和位置的設(shè)置,編程量較大,效率低,容易出錯。

(2)隨著窗口的拉伸,窗口中組件的位置不隨著變化。

對容器進(jìn)行絕對布局的主要思路是:

(1)將容器的布局管理器設(shè)置為空:

容器.setLayout(null);

(2)對于每個組件設(shè)置大小和位置:

組件.setBounds(x,y,width,height);

其中,x、y為組件左上角在容器中的坐標(biāo),width、height為組件的寬和高。

程序結(jié)果:

11.6.2流式布局管理器

如果使用絕對布局的方式來設(shè)置窗口組件的布局,當(dāng)組件比較多、布局比較復(fù)雜時,編程會比較麻煩,也很難維護(hù),經(jīng)常會出現(xiàn)一個組件位置或大小的變化影響到整個布局且很難調(diào)整的情況。為了使生成的圖形用戶界面具有平臺無關(guān)性,Java使用布局管理器類來管理組件在容器中的布局,目的是在相應(yīng)的布局規(guī)則下減少程序員的編程量,不需要對每個組件設(shè)置大小和位置,易于維護(hù)。

1.FlowLayout(java.awt.FlowLayout)類的布局描述

(1)某個java容器使用流式布局管理器,表示向容器中加入的組件將從左向右、從上到下自動排列,碰到容器邊界就轉(zhuǎn)到下一行繼續(xù)排列。

(2)組件不需要設(shè)置大小,組件的大小由組件本身決定,例如JLabel、JButton組件承載的文字多少和圖像大小決定其組件大小。

(3)當(dāng)容器被拉伸時,容器中的組件按照FlowLayout的布局規(guī)則自動調(diào)整位置。

(4)使用FlowLayout作為默認(rèn)布局管理器的容器為JPanel和JApplet兩個中間容器。

2.FlowLayout方法說明

該類的常用方法如表11-8所示。

3.FlowLayout的對齊屬性

(1)?0或FlowLayout.LEFT:控件左對齊。

(2)?1或FlowLayout.CENTER:居中對齊。

(3)?2或FlowLayout.RIGHT:右對齊。

(4)?3或FlowLayout.LEADING:控件與容器方向開始邊對應(yīng)。

(5)?4或FlowLayout.TRAILING:控件與容器方向結(jié)束邊對應(yīng)。

(6)如果是01234之外的整數(shù):左對齊。

4.FlowLayout的應(yīng)用

程序結(jié)果

對該窗口進(jìn)行拉伸可以看到下面情況:

11.6.3邊界布局管理器

1.BorderLayout(java.awt.BorderLayout)布局描述

(1)使用BorderLayout作為默認(rèn)布局管理器的容器是頂級容器JFrame和JDialog。

(2)某個容器使用邊界布局管理器時,邊界布局管理器把容器內(nèi)部分為五個位置,即上北(NORTH)、下南(SOUTH)、左西(WEST)、右東(EAST)、中(CENTER),如圖11-8所示。

圖11-8邊界布局的五個位置

(3)該容器最多只能加入五個組件(或容器),缺省位置為CENTER,當(dāng)組件(或容器)加入到某個位置時會自動被拉伸充滿該位置。如果多個組件加入同一個區(qū)域,就會產(chǎn)生覆蓋效果,在該區(qū)域只能看到最后一個加入的組件。

(4)一般情況下是頂級容器如JFrame使用BorderLayout,然后將面板加入到這些區(qū)域,再將組件加入到面板中。

2.BorderLayout方法說明

BorderLayout的常用方法如表11-9所示。

3.BorderLayout的靜態(tài)屬性

(1)?BorderLayout.CENTER:容器中央。

(2)?BorderLayout.WEST:容器左邊。

(3)?BorderLayout.EAST:容器右邊。

(4)?BorderLayout.NORTH:容器頂部。

(5)?BorderLayout.SOUTH:容器底部。

(6)?BorderLayout.LINE_START:行方向的開始處。

(7)?BorderLayout.LINE_END:行方向的結(jié)尾處。

(8)?BorderLayout.PAGE_START:第一行布局內(nèi)容之前。

(9)?BorderLayout.PAGE_END:最后一行布局內(nèi)容之后。

4.BorderLayout的使用

程序結(jié)果:

對該窗口進(jìn)行拉伸后可以看到下面情況:

上述程序是將五個按鈕放入五個區(qū)域,而實際編程中,可能只能放入2到3個組件。對于本程序中的以下五個語句,選擇其中幾個進(jìn)行組合,會得到下面的程序結(jié)果。

contentPane.add(BorderLayout.NORTH,buttons[0]);

contentPane.add(BorderLayout.WEST,buttons[1]);

contentPane.add(BorderLayout.CENTER,buttons[2]);

contentPane.add(BorderLayout.EAST,buttons[3]);

contentPane.add(BorderLayout.SOUTH,buttons[4]);

程序結(jié)果:

11.6.4網(wǎng)格布局管理器

1.GridLayout(java.awt.GridLayout)布局描述

(1)容器中的各組件呈M行?×?N列的網(wǎng)格狀分布。

(2)網(wǎng)格每列寬度相同,等于容器的寬度除以網(wǎng)格的列數(shù),網(wǎng)格每行高度相同,等于容器的高度除以網(wǎng)格的行數(shù)。

(3)各組件的排列方式為從上到下、從左到右,組件放入容器的順序決定了它在容器中的位置,如:第一個加入容器的組件放在第1行第1列網(wǎng)格,第二個加入的組件放在第1行第2列網(wǎng)格。

(4)容器大小改變時,組件的相對位置不變,大小跟著縮小或拉伸。

2.GridLayout構(gòu)造函數(shù)

GridLayout類的構(gòu)造函數(shù)如表11-10所示。

3.GridLayout常用方法

GridLayout的常用方法如表11-11所示。

4.?GridLayout的使用

程序結(jié)果:

11.6.5網(wǎng)格包布局管理器

1.GridbagLayout(java.awt.GridbagLayout)布局描述

(1)網(wǎng)格包布局是目前接觸到的最復(fù)雜和靈活的布局管理器,在網(wǎng)格布局的基礎(chǔ)上,對于加入容器中的組件的布局控制性更強,比如能讓組件跨越多個單元格,能讓組件在單元格中具有各種拉伸方式、對齊方式等等。

(2)每個GridBagLayout對象維持一個動態(tài)的矩形單元網(wǎng)格,每個組件占用一個或多個這樣的單元,稱為顯示區(qū)域;網(wǎng)格坐標(biāo)(0,0)位于容器的左上角網(wǎng)格,其中X向右遞增,Y向下遞增。

(3)容器使用GridbagLayout進(jìn)行布局,需要聯(lián)合GridBagConstraints網(wǎng)格包約束對象:首先生成網(wǎng)格包約束對象c,然后對c進(jìn)行布局屬性的設(shè)置,容器在加入某個組件之前,將組件和網(wǎng)格包約束對象進(jìn)行綁定:

網(wǎng)格包布局管理器對象.setConstraints(組件對象,網(wǎng)格包約束對象c);

這樣組件加入容器時就具有網(wǎng)格包約束對象設(shè)置的布局特性,即每個組件在容器中的布局是由網(wǎng)格包約束對象來規(guī)定的。

2.GridBagConstraints網(wǎng)格包約束對象描述

GridBagConstraints網(wǎng)格包約束對象的使用主要是設(shè)置其布局屬性,這些布局屬性對應(yīng)各種布局規(guī)則,然后將該對象與窗口組件“綁定”,這些布局規(guī)則就作用于要加入網(wǎng)格包布局容器的組件上,使之完成較為復(fù)雜和靈活的布局。其主要的屬性如下:

(1)?gridx和gridy:設(shè)置組件的位置(x和y坐標(biāo))。

①gridx設(shè)置為GridBagConstraints.RELATIVE,代表此組件位于之前所加入組件的右邊。

②gridy設(shè)置為GridBagConstraints.RELATIVE,代表此組件位于以前所加入組件的下面。

③建議定義出gridx、gridy的位置,表示放在幾行幾列,例如gridx=0,gridy=0時放在0行0列。

(2)?gridwidth和gridheight:設(shè)置組件所占寬度和高度。

①默認(rèn)值為1,gridwidth=2表示占2個網(wǎng)格的寬度,gridheight=2表示占2個網(wǎng)格的高度,也即組件跨越的單元格。

②可以使用GridBagConstraints.REMAINDER常量,代表此組件為此行或此列的最后一個組件,而且會占據(jù)所有剩余的空間。

(3)?weightx和weighty:拉伸比例。

①默認(rèn)值皆為0,表示組件大小固定,窗口被拉伸,但是組件大小不會變化。

②如果設(shè)置為非0,則窗口被拉伸變大時,各組件隨著比例變大;數(shù)字越大,表示組件能得到的空間更多。

(4)?insets:組件之間的間距。

①有四個參數(shù),分別是上、左、下、右,默認(rèn)值為(0,0,0,0)。

②對于網(wǎng)格包約束對象進(jìn)行insets的設(shè)置,需要Insets對象,例如:

c.insets=newInsets(10,0,0,0); //上部有10像素的間距

(5)?fill:組件在單元格中的填充情況。

①如果顯示區(qū)域比組件的區(qū)域大,可以用fill屬性來控制組件的填充行為。

②可以控制組件在單元格中進(jìn)行垂直填充、水平填充或者兩個方向一起填充。

③使用方式,例如:

(6)?anchor:組件??课恢?。

①當(dāng)組件小于其顯示區(qū)域時,用于確定將組件置于顯示區(qū)域(網(wǎng)格)的何處。

②c.anchor可以設(shè)置為下列屬性,以表示組件在網(wǎng)格中的??课恢茫?/p>

(7)?ipadx和ipady:組件內(nèi)部填充,默認(rèn)值為0。

3.?GridBagLayout和GridBagConstraints的使用

程序結(jié)果:

本章小結(jié)

1.Java圖形用戶界面設(shè)計主要使用java.awt和javax.swing兩個包下的類來完成。

2.窗口設(shè)計主要有以下幾個步驟:(1)使用JFrame類構(gòu)成窗口并設(shè)置窗口屬性。(2)創(chuàng)建javax.swing包下的各種窗口組件類對象,對組件進(jìn)行屬性設(shè)置后加入到容器/窗口中。(3)對容器中的組件進(jìn)行布局(絕對布局或布局管理)。(4)對各個窗口組件進(jìn)行事件處理,使之能響應(yīng)相應(yīng)的事件。

3.Java的窗口組件很多,本章主要介紹了窗口容器JFrame,面板容器JPanel,標(biāo)簽JLabel,命令按鈕JButton,復(fù)選框JCheckBox,單選按鈕JRadioButton,文本框JTextField,密碼框JPassword,文本區(qū)JArea,下拉列表JCombox,菜單JMenu、JMenuBar和JMenuItem等,以及一些輔助類,如字體Font、顏色Color、圖像Image和ImageIcon等,還有其它很多窗口組件需要讀者繼續(xù)挖掘?qū)W習(xí)。

4.JavaGUI容器的布局管理主要是分為絕對布局和布局管理器兩種方式。絕對布局需要對容器中的每一個組件設(shè)置好大小和位置;布局管理器是使用相應(yīng)布局類的規(guī)則自動管理容器的布局。

5.本章介紹了流式布局FlowLayout、邊界布局BorderLayout、網(wǎng)格布局GridLayout和網(wǎng)格包布局GridBagLayout等,配合JPanel的使用,Java初學(xué)者可以完成簡單到較為復(fù)雜的容器布局。

6.除了以上四個較為常用的布局管理器外,還有卡片布局(java.awt.CardLayout)、盒子布局(javax.swing.BoxLayout)、重疊布局(javax.swing.OverlayLayout)等,在此就不再進(jìn)行介紹,讀者可在課后自行學(xué)習(xí)。第十二章事件處理12.1事件基本概念12.2委托事件模型12.3事件處理程序本章小結(jié)

12.1事件基本概念

12.1.1事件窗口的事件(event)指的是用戶使用鼠標(biāo)、鍵盤在窗口程序中對窗口組件進(jìn)行的各種操作,例如鼠標(biāo)點擊、進(jìn)入、移動、拖動以及鍵盤鍵入等。事件也可以由操作系統(tǒng)觸發(fā),例如時間計時器等,事件類的主要類層次如圖12-1所示。

圖12-1事件類層次結(jié)構(gòu)

java.util.EventObject是所有事件類的超類,具有方法getSource(),用于返回產(chǎn)生某事件的組件對象(事件源);java.awt.AWTEvent是所有AWT事件的根事件類,此類及其子類取代了原來的java.awt.Event類,具有方法getID(),返回某事件的ID號。

Java的部分事件類描述如表12-1所示。

12.1.2事件源

事件源(EventSource)即事件發(fā)生的地方,主要指的是事件發(fā)生在哪個窗口組件上。上述的事件類大多與相應(yīng)的事件源對應(yīng),如表12-2所示。

12.1.3監(jiān)聽器接口與監(jiān)聽器對象

窗口組件的事件如何進(jìn)行處理呢?Java將窗口組件的事件處理“委托”給監(jiān)聽器對象來完成,監(jiān)聽器對象是監(jiān)聽器接口的實現(xiàn)類對象。

1.監(jiān)聽器接口

Java的接口java.util.EventListener是所有監(jiān)聽器接口的父接口,該父接口下約有70多個子接口,較為常用的接口如表12-3所示。

不同的監(jiān)聽器接口監(jiān)聽的事件源不同,監(jiān)聽的具體事件也不同;在監(jiān)聽器接口中聲明了被監(jiān)聽組件發(fā)生相應(yīng)事件時應(yīng)該被調(diào)用的事件處理方法,方法的具體代碼由監(jiān)聽器接口的實現(xiàn)類來完成。例如鍵盤監(jiān)聽器接口KeyListener將監(jiān)聽某個窗口組件的鍵盤事件,接口的定義如下:

鍵盤監(jiān)聽器接口KeyListener聲明了三個方法監(jiān)聽某個組件上對應(yīng)的事件,當(dāng)事件發(fā)生時將調(diào)用相應(yīng)的方法:

(1)鍵盤按鍵被按下,調(diào)用keyPressed方法。

(2)鍵盤按鍵抬起來,調(diào)用keyReleased方法。

(3)鍵盤按鍵被敲擊一次,調(diào)用keyTyped方法。

2.監(jiān)聽器對象

監(jiān)聽器對象是監(jiān)聽器接口實現(xiàn)類的實例對象,該對象具有監(jiān)聽窗口組件指定事件的能力,當(dāng)該事件在窗口組件上發(fā)生時,監(jiān)聽器對象能夠獲取該事件對象并執(zhí)行預(yù)定義的方法,用以實現(xiàn)事件處理。

對于不同組件可能發(fā)生的對應(yīng)事件,需要選擇相應(yīng)的監(jiān)聽器接口,自定義監(jiān)聽器類實現(xiàn)該接口,將事件發(fā)生時要執(zhí)行的動作代碼寫到接口聲明的方法中,然后創(chuàng)建監(jiān)聽器對象與被監(jiān)聽的組件進(jìn)行綁定,就可以“坐等”該組件上指定事件的發(fā)生。

12.1.4監(jiān)聽器適配器

監(jiān)聽器適配器(ListenerAdapter)是空實現(xiàn)了對應(yīng)監(jiān)聽器接口的類,即監(jiān)聽器適配器將監(jiān)聽器接口的所有方法進(jìn)行了實現(xiàn),但是方法體為空,這樣可方便程序員繼承監(jiān)聽器適配器而不用實現(xiàn)監(jiān)聽器接口,如圖12-2所示。

圖12-2監(jiān)聽器適配器

因為適配器已經(jīng)空實現(xiàn)了監(jiān)聽器的所有抽象方法,對于自定義監(jiān)聽器類而言,繼承了適配器也就相當(dāng)于空實現(xiàn)了監(jiān)聽器接口。對于接口中的多個抽象方法,需要在哪個方法中寫事件處理代碼,只需要重寫那個方法即可,其它不需要的方法可以不用管。常用監(jiān)聽器對應(yīng)的適配器如表12-4所示。

12.2委托事件模型

從前面對Java事件處理的基本概念的描述可知,窗口組件對事件的處理是“委托”給監(jiān)聽器對象來完成的,而事件處理要求Java程序員需要做的有以下幾步:(1)編寫自定義監(jiān)聽器類,可以實

溫馨提示

  • 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

提交評論