學(xué)習(xí)目標(biāo):
1、掌握布局管理器、AWT事件處理機(jī)制以及常用事件
2、熟悉Swing組件的使用
3、了解GUI開發(fā)的相關(guān)原理和技巧
GUI全稱是GraphicalUser Interface,即圖形用戶界面。顧名思義,就是應(yīng)用程序提供給用戶操作的圖形界面,包括窗口、菜單、按鈕、工具欄和其他各種圖形界面元素。目前,圖形用戶界面已經(jīng)成為一種趨勢,幾乎所有的程序設(shè)計(jì)語言都提供了GUI設(shè)計(jì)功能。Java中針對GUI設(shè)計(jì)提供了豐富的類庫,這些類分別位于java.awt和javaxswing包中,簡稱為AWT和Swing。其中,AWT是SUN公司最早推出的一套API,它需要利用本地操作系統(tǒng)所提供的圖形庫,屬于重量級(jí)組件,不跨平臺(tái),它的組件種類有限,可以提供基本的GUI設(shè)計(jì)工具,卻無法實(shí)現(xiàn)目前GUI設(shè)計(jì)所需的所有功能。隨后,SUN公司對AWT進(jìn)行改進(jìn),提供了Swing組件,Swing組件由純Java語言編寫,屬于輕量級(jí)組件,可跨平臺(tái),Swing不僅實(shí)現(xiàn)了AWT中的所有功能,而且提供了更加豐富的組件和功能,足以滿足GUI設(shè)計(jì)的一切需求。Swing會(huì)用到AWT中的許多知識(shí),掌握了AWT,學(xué)習(xí)Swing就變成了一件很容易的事情,因此本章將從AWT開始學(xué)習(xí)圖形用戶界面。
8.1 AWT概述
AWT是用于創(chuàng)建圖形用戶界面的一個(gè)工具包,它提供了一系列用于實(shí)現(xiàn)圖形界面的組件,如窗口、按鈕、文本框、對話框等。在JDK中針對每個(gè)組件都提供了對應(yīng)的Java類,這些類都位于iava.awt包中,接下來通過一個(gè)圖例來描述這些類的繼承關(guān)系,如圖所示
?從圖的繼承關(guān)系可以看出,在AWT中組件分為兩大類,這兩類的基類分別是Component和MenuComponent。其中,MenuComponent是所有與菜單相關(guān)組件的父類,Component則是除菜單外其他AWT組件的父類,它表示一個(gè)能以圖形化方式顯示出來,并可與用戶交互的對象。
Component類通常被稱為組件,根據(jù)Component的不同作用,可將其分為基本組件類和容器類?;窘M件類是諸如按鈕、文本框之類的圖形界面元素,而容器類則是通過Component的子類Container實(shí)例化的對象。Container類表示容器它是一種特殊的組件,可以用來容納其他組件。Container容器又分為兩種類型分別是Window和Panel,接下來對兩種類型進(jìn)行詳細(xì)講解。
Window類是不依賴其他容器而獨(dú)立存在的容器,它有兩個(gè)子類,分別是Frame類和Dialog類。Frame類用于創(chuàng)建一個(gè)具有標(biāo)題欄的框架窗口,作為程序的主界面,Dialog類用于創(chuàng)建一個(gè)對話框,實(shí)現(xiàn)與用戶的信息交互,如圖所示
Panel也是一個(gè)容器,但是它不能單獨(dú)存在,只能存在其他容器 (Window或其子類)中,一個(gè)Panel對象代表了一個(gè)長方形的區(qū)域,在這個(gè)區(qū)域中可以容納其他組件。在程序中通常會(huì)使用Panel來實(shí)現(xiàn)一些特殊的布局。
package cn.itcast.chapter08.example01;
import java.awt.Frame;
public class Example01 {
public static void main(String[] args) {
//建立一個(gè)新窗體對象
Frame f = new Frame("我的窗體!");
//設(shè)置窗體的寬和高
f.setSize(400, 300);
//設(shè)置窗體在屏幕中所處的位置(參數(shù)是左上角坐標(biāo))
f.setLocation(300, 200);
//設(shè)置窗體可見
f.setVisible(true);
}
}
?
8.2 布局管理器?
8.1小節(jié)提到過,組件不能單獨(dú)存在,必須放置于容器當(dāng)中,而組件在容器中的位置和尺寸是由布局管理器來決定的。在java.awt包中提供了五種布局管理器,分別是FlowLayout (流式布局管理器) 、BorderLayout (邊界布局管理器GridLayout(網(wǎng)格布局管理器) 、GridBagLayout (網(wǎng)格包布局管理器)和CardLayout (卡片布局管理器)。每個(gè)容器在創(chuàng)建時(shí)都會(huì)使用一種默認(rèn)的布局管理器,在程序中可以通過調(diào)用容器對象的setLayout()方法設(shè)置布局管理器通過布局管理器來自動(dòng)進(jìn)行組件的布局管理。例如把一個(gè)Frame窗體的布局管理器設(shè)置為FlowLayout,代碼如下所示:
?FlowLayout
流式布局管理器 (FlowLayout) 是最簡單的布局管理器,在這種布局下,容器會(huì)將組件按照添加順序從左向右放置。當(dāng)?shù)竭_(dá)容器的邊界時(shí),會(huì)自動(dòng)將組件放到下一行的開始位置。這些組件可以左對齊、居中對齊(默認(rèn)方式)或右對齊的方式排列。FlowLayout對象有三個(gè)構(gòu)造方法,如表所示
表中,列出了FlowLayout的三個(gè)構(gòu)造方法,其中,參數(shù)align決定組件在每行中相對于容器邊界的對齊方式,可以使用該類中提供的常量作為參數(shù)傳遞給構(gòu)造方法,其中FlowLayout.LEFT用于表示左對齊、FlowLayout.RIGHT用于表示右對齊FlowLayout.CENTER用于表示居中對齊。參數(shù)hgap和參數(shù)vgap分別設(shè)定組件之間的水平和垂直間隙,可以填入一個(gè)任意數(shù)值。
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
public class Example02 {
public static void main(String[] args) {
//創(chuàng)建一個(gè)名為FlowLayout的窗體
Frame f = new Frame("FlowLayout");
//設(shè)置窗體中的布局管理器FlowLayout,所有組件左對齊,水平間距為20,垂直間距30
f.setLayout(new FlowLayout(FlowLayout.LEFT, 20, 30));
//設(shè)置窗體的大小
f.setSize(220, 300);
//設(shè)置窗體顯示位置
f.setLocation(300, 200);
//把按鈕添加到窗口
f.add(new Button("第1個(gè)按鈕"));
f.add(new Button("第2個(gè)按鈕"));
f.add(new Button("第3個(gè)按鈕"));
f.add(new Button("第4個(gè)按鈕"));
//設(shè)置窗體可見
f.setVisible(true);
}
}
?
BorderLayout
BorderLayout (邊界布局管理器) 是一種較為復(fù)雜的布方式,它將容器劃分為五個(gè)區(qū)域,分別是東(EAST)、南(SOUTH)、西(WEST)、北(NORTH)、中(CENTER)。組件可以被放置在這五個(gè)區(qū)域中的任意一個(gè)。BorderLayout布局的效果如圖所示
從圖可以看出BorderLayout邊界布局管理器,將容器劃分為五個(gè)區(qū)域,其中箭頭是指改變?nèi)萜鞔笮r(shí),各個(gè)區(qū)域需要改變的方向。也就是說,在改變?nèi)萜鲿r(shí)NORTH和SOUTH區(qū)域高度不變長度調(diào)整,WEST和EAST區(qū)域?qū)挾炔蛔兏叨日{(diào)整CENTER會(huì)相應(yīng)進(jìn)行調(diào)整。?
當(dāng)向BorderLayout布局管理器的容器中添加組件時(shí),需要使用add(Componentcomp,Object constraints)方法。其中參數(shù)comp表示要添加的組件,constraints指定將組件添加到布局中的方式和位置的對象,它是一個(gè)Obiect類型,在傳參時(shí)可以使用BorderLayout類提供的5個(gè)常量,它們分別是EAST、SOUTH、WEST、NORTH和CENTER。
案例代碼
接下來通過一個(gè)案例來演示一下BorderLayout布局管理器對組件布局的效果:
package cn.itcast.chapter08.example03;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
public class Example03 {
public static void main(String[] args) {
Frame f = new Frame("BorderLayout"); //創(chuàng)建一個(gè)BorderLayout的窗體
f.setLayout(new BorderLayout()); //設(shè)置窗體中的布局管理器
f.setSize(300, 300); //設(shè)置窗體大小
f.setLocation(300, 200); //設(shè)置窗體顯示位置
f.setVisible(true); //設(shè)置窗體可見
//下面代碼是創(chuàng)建5個(gè)按鈕,分別用于填充BorderLayout的5個(gè)區(qū)域
Button but1 = new Button("東部");
Button but2 = new Button("西部");
Button but3 = new Button("南部");
Button but4 = new Button("北部");
Button but5 = new Button("中部");
//將創(chuàng)建好的按鈕添加到窗體中,并設(shè)置按鈕所在區(qū)域
f.add(but1,BorderLayout.EAST);
f.add(but2,BorderLayout.WEST);
f.add(but3,BorderLayout.SOUTH);
f.add(but4,BorderLayout.NORTH);
f.add(but5,BorderLayout.CENTER);
}
}
?GridLayout
GridLayout(網(wǎng)格布局管理器) 使用縱橫線將容器分成n行m列大小相等的網(wǎng)格每個(gè)網(wǎng)格中放置一個(gè)組件。添加到容器中的組件首先放置在第1行第1列(左上角)的網(wǎng)格中,然后在第1行的網(wǎng)格中從左向右依次放置其他組件,行滿后繼續(xù)在下一行中從左到右放置組件。與FlowLayout不同的是,放置在GridLayout布局管理器中的組件將自動(dòng)占據(jù)網(wǎng)格的整個(gè)區(qū)域。
接下來學(xué)習(xí)下GridLayout的構(gòu)造方法,如表所示
表中,列出了GridLayout的三個(gè)構(gòu)造方法,其中,參數(shù)rows代表行數(shù),cols代表列數(shù),hgap和vgap規(guī)定水平和垂直方向的間隙。水平間隙指的是網(wǎng)格之間的水平距離,垂直間隙指的是網(wǎng)格之間的垂直距離。
案例代碼
接下來通過一個(gè)案例演示GridLayout布局的用法 :
package cn.itcast.chapter08.example04;
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;
public class Example04 {
public static void main(String[] args) {
Frame f = new Frame("GridLayout"); //創(chuàng)建一個(gè)GridLayout窗體
f.setLayout(new GridLayout(3,3)); //設(shè)置GridLayout網(wǎng)格布局管理器,該窗體網(wǎng)格為3*3
f.setSize(300, 300); //設(shè)置窗體大小
f.setLocation(400, 300); //設(shè)置窗體位置
//循環(huán)添加9個(gè)按鈕到GridLayout
for (int i = 1; i <= 9; i++) {
Button but = new Button("but"+i);
f.add(but); //想窗體中添加按鈕
}
f.setVisible(true); //設(shè)置窗體可見
}
}
GridBagLayout?
GridBagLayout (網(wǎng)格包布局管理器)是最靈活、最復(fù)雜的布局管理器。與GridLayout布局管理器類似,不同的是,它允許網(wǎng)格中的組件大小各不相同而且允許一個(gè)組件跨越一個(gè)或者多個(gè)網(wǎng)格
使用GridBagLayout布局管理器的步驟如下:
(1)創(chuàng)建GridbagLayout布局管理器,并使容器采用該布局管理器
(2)創(chuàng)建GridBagontraints對象(布局約束條件),并設(shè)置該對象的相關(guān)屬性?
?(3)調(diào)用GridBagLayout對象的setConstraints()方法建立GridBagConstraints對象和受控組件之間的關(guān)聯(lián)
(4)向容器中添加組件
文章來源:http://www.zghlxwxcb.cn/news/detail-490909.html
GridBagConstraints對象可以重復(fù)使用,只需要改變它的屬性即可。如果要向容器中添加多個(gè)組件,則重復(fù) (2) 、 (3) 、 (4) 步驟
從上面的步可以看出,使用GridBagLayout布局管理器的關(guān)鍵在于GridBagConstraints對象,它才是控制容器中每個(gè)組件布局的核心類,在GridBagConstraints類中有很多表示約束的屬性,下面對GridBagConstraints類的一些常用屬性進(jìn)行介紹,如表所示。?文章來源地址http://www.zghlxwxcb.cn/news/detail-490909.html
到了這里,關(guān)于Java——GUI(圖形用戶界面)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!