AWT概述
目錄
AWT繼承關(guān)系
window
Panel
布局管理器
FlowLayout(流式布局管理器)
BorderLayout(邊界布局管理器)
GridLayout(網(wǎng)格布局管理器)
GridBagLayout(網(wǎng)格包布局管理器)
?CardLayout(卡片布局管理器)
AWT繼承關(guān)系
AWT提供了一系列用于圖形界面的組件,如窗口、按鈕、文本框、對話框等等。接下看一下他們之間的繼承關(guān)系:
?
window
window類是不依賴于其他容器而獨立存在容器,它有兩個子類,分別是Frame類和Dialog類。對于Frame類用于創(chuàng)建一個具有標(biāo)題欄的框架窗口,作為程序的主界面;而Dialog用于創(chuàng)建一個對話框,用于實現(xiàn)與用戶的信息交互。
Panel
Panel是一個容器,他不能單獨存在,必須存在于其他容器中,比如Window類或者其子類,Panel對象代表了一個長方形的區(qū)域,在這個區(qū)域中可以收納其他組件,在程序中通常用Panel來實現(xiàn)一些特殊的布局。
布局管理器
由于組件不能單獨存在,必須放在容器當(dāng)中,為了更好的布置組件的位置和尺寸,所以要設(shè)置布局管理器進(jìn)行布局。在Java中,有五種布局管理器,分別為Flowlayout , Boderlayout , Gridlayout, Gridbaglayout 和 cardlayout.
FlowLayout(流式布局管理器)
布局規(guī)則:
| Constructor描述 | |
| 1 | FlowLayout?() 構(gòu)造一個新的 FlowLayout ,具有中心對齊和默認(rèn)的5單位水平和垂直間隙。 |
| 2 | FlowLayout?(int?align) 構(gòu)造新的 FlowLayout具有指定的對齊和默認(rèn)的5單位水平和垂直間隙。 |
| 3 | FlowLayout?(int?align, int?hgap, int?vgap) 創(chuàng)建一個新的流程布局管理器,具有指示的對齊方式和指示的水平和垂直間距。 |
參數(shù):
align?-?對齊值,值一般是FlowLayout.LEFT?,?FlowLayout.RIGHT?,?FlowLayout.CENTER?,?FlowLayout.LEADING?,或FlowLayout.TRAILING?。?
hgap?-?組件之間和組件之間的水平間隙和?Container的邊界?
vgap?-?組件之間和組件之間的垂直間隙以及?Container的邊框
實例:
import java.awt.*; public class test1 {public static void main(String[] args) { // 創(chuàng)建窗口體final Frame f=new Frame("Flowlayout"); // 設(shè)置布局管理器為FlowLayout,所有組件左對齊,水平距離20,垂直距離為30f.setLayout(new FlowLayout(FlowLayout.LEFT,20,30)); // 設(shè)置窗口大小f.setSize(220,300); // 設(shè)置顯示位置f.setLocation(300,200); // 添加按鈕f.add(new Button("第1個按鈕"));f.add(new Button("第2個按鈕"));f.add(new Button("第3個按鈕"));f.add(new Button("第4個按鈕"));f.add(new Button("第5個按鈕"));f.add(new Button("第6個按鈕")); // 設(shè)置窗口可見f.setVisible(true);} }運行結(jié)果:
分析:
所有組件有規(guī)律的進(jìn)行排列,但是靈活性差了一點,還有你會發(fā)現(xiàn),這個頁面不能退出,那是沒有編寫退出事件,請看下一文,詳細(xì)說明如何編寫退出事件:
AWT事件處理
BorderLayout(邊界布局管理器)
布局規(guī)則:分為五個板塊位置,如下圖:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
實例:
import java.awt.*; public class test2 {public static void main(String[] args) { // 創(chuàng)建窗口體,進(jìn)行命名final Frame f=new Frame("Flowlayout"); // 設(shè)置布局管理器,窗口大小,窗口的位置f.setLayout(new BorderLayout());f.setSize(300,300);f.setLocation(300,200);f.setVisible(true);Button bu1=new Button("東方");Button bu2=new Button("西方");Button bu3=new Button("南方");Button bu4=new Button("北方");Button bu5=new Button("中方");f.add(bu1,BorderLayout.EAST);f.add(bu2,BorderLayout.WEST);f.add(bu3,BorderLayout.SOUTH);f.add(bu4,BorderLayout.NORTH);f.add(bu5,BorderLayout.CENTER);} }運行結(jié)果:
分析:
如果不指定添加到那個區(qū)域,組件會默認(rèn)添加到center區(qū)域,并且每個區(qū)域只能添加一個組件,一個區(qū)域添加多個組件時,后添加的組件會覆蓋原來的組件。
GridLayout(網(wǎng)格布局管理器)
布局規(guī)則:
用橫豎線把容器分為N行M列大小相同的網(wǎng)格,然后依次像FlowLayout一樣添加組件,并且每個網(wǎng)格放置一個組件。
| Constructor描述 | |
| 1 | GridLayout?() 在單個行中創(chuàng)建一個每個組件的默認(rèn)值為一列的網(wǎng)格布局。 |
| 2 | GridLayout?(int?rows, int?cols) 創(chuàng)建具有指定行數(shù)和列數(shù)的網(wǎng)格布局。 |
| 3 | GridLayout?(int?rows, int?cols, int?hgap, int?vgap) 創(chuàng)建具有指定行數(shù)和列數(shù)的網(wǎng)格布局。 |
rows和cols一個但不是兩個可以為零,這意味著可以將任意數(shù)量的對象放置在行或列中。?
所有GridLayout構(gòu)造函數(shù)都GridLayout這一個。?
參數(shù)?
rows?-?值為0,表示任意數(shù)量的行?
cols?-?列,值為零表示任意數(shù)量的列?
hgap?-?水平間隙?
vgap?-?垂直間隙?
實例:
運行結(jié)果:
分析:
組件的相對位置不會隨著區(qū)域縮放而改變,但是組件的大小會隨著縮放會改變
GridBagLayout(網(wǎng)格包布局管理器)
最為復(fù)雜,最靈活的布局管理器。
布局規(guī)則:
與GridLayout相似,不同在于組件可以跨多個網(wǎng)格。
可以垂直,水平或沿其基準(zhǔn)對齊組件,而不需要組件的大小相同。?每個GridBagLayout對象維護(hù)一個動態(tài)的,矩形的單元格網(wǎng)格,每個組件占據(jù)一個或多個單元格,稱為其顯示區(qū)域?。?由GridBagLayout管理的每個組件與一個GridBagConstraints的實例相關(guān)聯(lián)。?constraints對象指定組件的顯示區(qū)域在網(wǎng)格上的位置以及組件在其顯示區(qū)域內(nèi)的位置。?除了其約束對象? ? ? ? 外,?GridBagLayout還考慮每個組件的最小和首選大小,以確定組件的大小。?
容器的整體方向取決于集裝箱的ComponentOrientation屬性。?對于水平從左到右的方向,網(wǎng)格坐標(biāo)(0,0)位于容器的左上角,其中x向右增加,y向下增加。?對于水平從右到左的方向,網(wǎng)格坐標(biāo)(0,0)位于容器的右上角,其中x向左增加,y向下增加。?為了有效使用網(wǎng)格包布局,必須定制一個或多個GridBagConstraints了與它的組件相關(guān)聯(lián)的對象。
GridBagLayout常用屬性
1.GridBagConstraints.gridx , GridBagConstraints.gridy?
指定包含組件顯示區(qū)域的前角的單元格,其中網(wǎng)格原點的單元格地址gridx = 0 ,gridy = 0 。 對于水平從左到右的布局,組件的前角是其左上角。 對于水平從右到左的布局,組件的前角是其右上角。 使用GridBagConstraints.RELATIVE (默認(rèn)值)來指定在添加該組件之前添加到容器中的組件,立即將組件放置在(沿x軸為gridx或y軸為gridy )之后。?
2.GridBagConstraints.gridwidth , GridBagConstraints.gridheight?
指定組件顯示區(qū)域中一行中的單元格數(shù)( gridwidth )或列( gridheight )。 默認(rèn)值為1.使用GridBagConstraints.REMAINDER指定組件的顯示區(qū)域?qū)膅ridx到行中的最后一個單元格( gridwidth )或從gridy到列的最后一個單元格( gridheight )。 使用GridBagConstraints.RELATIVE指定組件的顯示區(qū)域?qū)膅ridx到其行中最后一個單元格的下一個( gridwidth或從gridy到其列中最后一個單元格的gridheight )( gridheight )。?
3.GridBagConstraints.fill?
當(dāng)組件的顯示區(qū)域大于組件的請求大小時使用,以確定是否(以及如何)調(diào)整組件的大小。 可能的值為
GridBagConstraints.NONE (默認(rèn)值), GridBagConstraints.HORIZONTAL (使組件寬度足以水平填充其顯示區(qū)域,但不要更改其高度), GridBagConstraints.VERTICAL (使組件足夠高以垂直填充其顯示區(qū)域,但不要更改其寬度)和GridBagConstraints.BOTH (使組件完全填充其顯示區(qū)域)。
4.GridBagConstraints.weightx, GridBagCOnstraints.weighty
設(shè)置組件占領(lǐng)容器中多余的水平方向和豎直方向空白比例(也稱為權(quán)重)。?
5.GridBagConstraints.ipadx , GridBagConstraints.ipady?
在布局中指定組件的內(nèi)部填充,添加到組件的最小大小的多少。 組件的寬度至少為其最小寬度加上ipadx像素。 類似地,組件的高度將至少為最小高度加上ipady像素。?
6.GridBagConstraints.insets?
指定組件的外部填充,組件與其顯示區(qū)域邊緣之間的最小空間量。?
7.GridBagConstraints.anchor?
指定組件在其顯示區(qū)域中的位置。 有三種可能的值:絕對值,方向相對值和基線相對方向相對值相對于容器的ComponentOrientation屬性進(jìn)行解釋,絕對值不是。 基線相對值相對于基線計算。 有效值為: Absolute, relative and baseline values as described above?
實例:
package daya7; import java.awt.*; // 網(wǎng)格包布局 class Layout extends Frame{public Layout(String title) { // 創(chuàng)建布局管理器,采用該布局GridBagLayout layout=new GridBagLayout();GridBagConstraints c=new GridBagConstraints();this.setLayout(layout); // 設(shè)置組件橫豎可拉伸距離,c.fill =GridBagConstraints.BOTH; // 設(shè)置橫向,豎向權(quán)重為1c.weightx=1;c.weighty=1;this.addComponent("btn1",layout,c);this.addComponent("btn2",layout,c);this.addComponent("btn3",layout,c); // 添加組件是本行最后一個組件c.gridwidth=GridBagConstraints.REMAINDER;this.addComponent("btn4", layout, c);c.weightx=0;c.weighty=0;this.addComponent("btn5", layout, c); // 設(shè)置組件跨一個網(wǎng)格(默認(rèn)值)c.gridwidth=1;this.addComponent("btn6", layout, c); // 添加組件是本行最后一個組件c.gridwidth=GridBagConstraints.REMAINDER;this.addComponent("btn7", layout, c); // 設(shè)置組件縱向跨兩個網(wǎng)格,橫向跨一個網(wǎng)格,橫向豎向權(quán)重為2c.gridheight=2;c.gridwidth=1;c.weightx=2;c.weighty=2;this.addComponent("btn8", layout, c);c.gridwidth=GridBagConstraints.REMAINDER;c.gridheight=1;this.addComponent("btn9", layout, c);this.addComponent("btn10", layout, c);this.setTitle(title);this.pack();this.setVisible(true); } // 添加組件的方法private void addComponent(String name, GridBagLayout layout, GridBagConstraints c) {// TODO Auto-generated method stubButton bt=new Button(name); // 設(shè)置GridBagConstraints和按鈕的關(guān)聯(lián)layout.setConstraints(bt, c); // 增加按鈕this.add(bt);} } public class test4_a{public static void main(String[] args) {new Layout("GridBagLayout");} }運行結(jié)果:
?CardLayout(卡片布局管理器)
布局規(guī)則:
把界面看作一系列卡片,便于切換界面,一次只能顯示一個界面卡片
實例:
package daya8; import java.awt.*; import java.awt.event.*; //定義Cardlayout繼承Frame類,實現(xiàn)ActionListener接口 class Cardlayout extends Frame implements ActionListener{ // 定義Panel畫板放置卡片Panel cardPanel =new Panel(); // 定義Panel面板放置按鈕Panel controlpaPanel=new Panel();Button nextButton,preButton; // 定義卡片布局對象CardLayout cardLayout=new CardLayout(); // 定義構(gòu)造方法,設(shè)置卡片布局管理器的屬性public Cardlayout() {setSize(400,400);setVisible(true); // 為窗口添加關(guān)閉事件監(jiān)聽器this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {Cardlayout.this.dispose();}});cardPanel.setLayout(cardLayout); // 在cardPanel面板對象添加3個文本標(biāo)簽cardPanel.add(new Label("第一個界面",Label.CENTER));cardPanel.add(new Label("第二個界面",Label.CENTER));cardPanel.add(new Label("第三個界面",Label.CENTER)); // 創(chuàng)建兩個按鈕對象nextButton=new Button("下一張");preButton =new Button("上一張"); // 為按鈕對象注冊監(jiān)聽器nextButton.addActionListener(this);preButton.addActionListener(this); // 將按鈕添加到controlpaPanelcontrolpaPanel.add(nextButton);controlpaPanel.add(preButton); // 將cardPanel面板放置在窗口邊界布局的中間,窗口默認(rèn)為邊界布局this.add(cardPanel,BorderLayout.CENTER); // 畫板放置在窗口邊界布局的南區(qū)this.add(controlpaPanel,BorderLayout.SOUTH);}@Override // 下面的代碼實現(xiàn)了按鈕的監(jiān)聽觸發(fā),并對觸發(fā)事件做出相應(yīng)的處理public void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubif(e.getSource()==nextButton) {cardLayout.next(cardPanel);}if(e.getSource()==preButton) {cardLayout.previous(cardPanel);}} } public class test2 {public static void main(String[] args) {System.out.println("a");Cardlayout cardlayout=new Cardlayout();} }運行結(jié)果:
?不使用布局管理器
當(dāng)一個容器創(chuàng)建的時候,都會有個默認(rèn)的布局管理器,window,Frame 和Dialog默認(rèn)管理器是BorderLayout,Panel默認(rèn)管理器是FlowLayout。如果不希望通過布局管理器進(jìn)行布局,可以利用容器的setLayout()方法將布局管理器進(jìn)行取消。
布局規(guī)則:
調(diào)用組件setSize和setLocation(或者setBounds方法)為組件進(jìn)行定位。
實例:
import java.awt.*; public class test6 {public static void main(String[] args) {Frame f=new Frame("不用布局管理器");f.setLayout(null);f.setSize(400,400);f.setLocation(300,300);Button btn1=new Button("one");Button btn2=new Button("two"); // 設(shè)置按鈕左上角的x,y坐標(biāo)以及按鈕的長寬btn1.setBounds(20, 30, 100, 40);btn2.setBounds(140, 100, 50, 20);f.add(btn1);f.add(btn2);f.setVisible(true);} }運行結(jié)果:
AWT事件處理
?實現(xiàn)關(guān)閉功能
package daya8; import java.awt.*; import java.awt.event.*; //監(jiān)聽事件 public class test3 {public static void main(String[] args) {Frame f=new Frame("my Window");f.setSize(400,300);f.setLocation(300,400);f.setVisible(true); // 為窗口組件注冊監(jiān)聽器MyWindowListener mw=new MyWindowListener();f.addWindowListener(mw); } } class MyWindowListener implements WindowListener{@Overridepublic void windowOpened(WindowEvent e) {// TODO Auto-generated method stub}@Overridepublic void windowClosing(WindowEvent e) {// TODO Auto-generated method stubWindow window=e.getWindow();window.setVisible(false);window.dispose();}@Overridepublic void windowClosed(WindowEvent e) {// TODO Auto-generated method stub // System.out.println("111111111111");}@Override // 窗口初始化設(shè)置public void windowIconified(WindowEvent e) {// TODO Auto-generated method stub} // 窗口已確認(rèn)@Overridepublic void windowDeiconified(WindowEvent e) {// TODO Auto-generated method stub} // 窗口已激活@Overridepublic void windowActivated(WindowEvent e) {// TODO Auto-generated method stub} // 窗口已停用@Overridepublic void windowDeactivated(WindowEvent e) {// TODO Auto-generated method stub}}事件適配器
package daya8; import java.awt.*; import java.awt.event.*; //事件適配器 public class test4 {public static void main(String[] args) {Frame f=new Frame("my Window");f.setSize(400,300);f.setLocation(300,400);f.setVisible(true);f.addWindowListener(new MyWindowListenera());}} class MyWindowListenera extends WindowAdapter{public void windowClosing(WindowEvent e) { // 獲取組件Window window =(Window) e.getComponent(); // 處理window.dispose();} }用匿名內(nèi)部類實行事件處理
package daya8; import java.awt.*; import java.awt.event.*; //事件適配器 public class test4 {public static void main(String[] args) {Frame f=new Frame("my Window");f.setSize(400,300);f.setLocation(300,400);f.setVisible(true);f.addWindowListener(new MyWindowListenera());}} class MyWindowListenera extends WindowAdapter{public void windowClosing(WindowEvent e) { // 獲取組件Window window =(Window) e.getComponent(); // 處理window.dispose();} }總結(jié)
- 上一篇: 图书馆情报领域核心期刊(2012)
- 下一篇: 【云计算】初入云计算