AWT和布局管理器
- AWT(Abstract Window Toolkit)抽象窗口開發包
- component:可以顯示出來的與用戶進行交互的圖形元素
- container:容納其他component元素的容器;continer可以容納component;所以container可以容納container。
continer對象可以使用add方法添加其他的component對象。
一般的component不能獨立顯示出來,必須放在某一continer對象中才可以顯示出來
兩種常用的container:
1、Windows:自由停泊的頂級窗口
- Dialog:模態和非模態對話框;
- Frame:可做獨立窗口顯示出來
Frame的構造方法:
Frame()
Frame(String s)//創建標題欄為字符串的窗口
setBounds(int x,int y,int width,int height) //設置窗體位置和大小,x,y為左上角坐標(單位為像素);width和height是寬度和高度
setSize(int width,int height)//設置窗體的大小
setLocation(int x,int y)//設置窗體的位置
setBackground(Color c)//設置背景顏色,設置為color對象 cyan青色;magenta洋紅
setVisible(boolean b)//設置是否可見
setTitle(String name) String getTitle()
setResizeble(boolean b) //設置是否可以調節大小
在未定義按鈕的情況下,Ctrl+c
setLayout()//設置布局
import java.awt.Color; import java.awt.Frame; public class TestMultiFrame { public static void main(String args[]) { MyFrame f1 = new MyFrame(100,100,200,200,Color.BLUE); MyFrame f2= new MyFrame(300,100,200,200,Color.YELLOW); MyFrame f3 = new MyFrame(100,300,200,200,Color.GREEN); MyFrame f4 = new MyFrame(300,300,200,200,Color.MAGENTA); } } class MyFrame extends Frame{ static int id = 0; MyFrame(int x,int y,int w,int h,Color color){ super("MyFrame " + (++id)); setBackground(color); setLayout(null); setBounds(x,y,w,h); setVisible(true); } }
運行結果:
2、Panel:不能自由停泊,不是頂級窗口,必須添加到continer裏面才能顯示出來。
Panel可以容納其他的component對象(例如:Button),但是不能獨立顯示。
Panel可以有自己的布局管理器
Panel是一般容器,可以自身嵌套(比如在panel1裏嵌入panel2);但Frame已經是頂層容器了,自身不能嵌套。
Panel的構造方法:
Panel()//使用默認FlowLayout類布局管理器初始化
Panel(LayoutManager layout)//使用指定的布局管理器初始化
Panel擁有從父類繼承來的
setBounds(int x,int y,int width,int height)
setSize(int width,int height)
setLocation(int x,int y)
setBackground(Color c)
setLayout(LayoutManager mgr)
import java.awt.*; public class TestMultiPanel { public static void main(String args[]) { new MyFrame2("MyFrameWithPanel",300,300,400,300); } } class MyFrame2 extends Frame{ private Panel p1,p2,p3,p4; MyFrame2(String s,int x,int y,int w,int h){ super(s); setLayout(null); p1 = new Panel(null); p2 = new Panel(null); p3 = new Panel(null); p4 = new Panel(null); p1.setBounds(0,0,w/2,h/2); p2.setBounds(0,h/2,w/2,h/2); p3.setBounds(w/2,0,w/2,h/2); p4.setBounds(w/2,h/2,w/2,h/2); p1.setBackground(Color.BLUE); p2.setBackground(Color.GREEN); p3.setBackground(Color.YELLOW); p4.setBackground(Color.MAGENTA); add(p1);add(p2);add(p3);add(p4); setBounds(x,y,w,h); setVisible(true); } }
運行結果:
?????是BorderLayout布局管理器?
為什麽Frame可以獨立顯示而Panel不可以?
在Window類裏定義了pack()和show()兩個顯示窗口的方法,被Frame繼承了過來。這可能也是panel無法單獨使用的一個原因吧,Panel和它的直接超類Container裏,都沒有定義類似pack()和show()的顯示容器的方法。
- 布局管理器
管理component在container中的布局,不必直接設置component的大小和位置
每個continer都有一個布局管理器對象,當容器需要對某個組件進行定位或判斷其大小尺寸時,就會調用其布局管理器,調用continer的setLayout方法改變其布局管理器對象
awt提供了5種布局管理器:(實現LayoutManager接口)
1、FlowLayout
panel類的默認布局管理器
逐行定位,行內從左到右,排滿換行,不改變組件大小,按組件原有尺寸顯示組件,可設置不同的組件間距,行距以及對齊方式。
FlowLayout的默認對齊方式為居中
setLayout(new FlowLayout())//FlowLayout實現了LayoutManager的接口//父類引用指向子類對象;
FlowLayout的構造函數:
new FlowLayout(FlowLayout.RIGHT,20,40);//右對齊,組件之間水平距離20像素,垂直距離40像素;
new FlowLayout(FlowLayout.LEFT); / /左對齊,水平和垂直距離為缺省值5
new FlowLayout();//居中對齊,水平和垂直距離為缺省值5(居中對齊為FlowLayout.CENTER)
import java.awt.*; public class TestFlowLayout2 { public static void main(String args[]) { Frame f = new Frame("Java Frame"); FlowLayout l = new FlowLayout(FlowLayout.CENTER, 20, 40); f.setLayout(l); f.setLocation(300,400); f.setSize(300,200); f.setBackground(new Color(204,204,255)); for(int i = 1; i<=7; i++){ f.add(new Button("BUTTON")); } f.setVisible(true); } }
運行結果:
2、BorderLayout
Frame類的默認管理器
BorderLayout將整個容器的布局分為:東(EAST)西(WEAST)南(SOUTH)北(NORTH)中(CENTER)五個布局,只能將組件放到指定區域。//為int型
如不指定組件位置,則將其放入CENTER;
每個區域只能加入一個組件,如加入多個,則先加入的會被覆蓋。
BorderLayout布局尺寸縮放原則:
南北兩個區域水平方向縮放
東西兩個區域垂直方向縮放
中間可在兩個方向上縮放
import java.awt.*; public class TestBorderLayout { public static void main(String args[]) { Frame f; f = new Frame("Border Layout"); Button bn = new Button("BN"); Button bs = new Button("BS"); Button bw = new Button("BW"); Button be = new Button("BE"); Button bc = new Button("BC"); f.add(bn, "North"); f.add(bs, "South"); f.add(bw, "West"); f.add(be, "East"); f.add(bc, "Center"); // 也可使用下述語句 /* f.add(bn, BorderLayout.NORTH); f.add(bs, BorderLayout.SOUTH); f.add(bw, BorderLayout.WEST); f.add(be, BorderLayout.EAST); f.add(bc, BorderLayout.CENTER); */ f.setSize(200,200); f.setVisible(true); } }
運行結果:
3、GridLayout
GridLayout將空間劃分為小格,每個單元格大小相等。組件被填到每個單元格中,從左到右填滿換行,從上到下。
GridLayout的構造方法:
例:GridLayout(3,4) //指定行數和列數
import java.awt.*; public class TestGridLayout { public static void main(String args[]) { Frame f = new Frame("GridLayout Example"); Button b1 = new Button("b1"); Button b2 = new Button("b2"); Button b3 = new Button("b3"); Button b4 = new Button("b4"); Button b5 = new Button("b5"); Button b6 = new Button("b6"); f.setLayout (new GridLayout(3,2)); f.add(b1); f.add(b2); f.add(b3); f.add(b4); f.add(b5); f.add(b6); f.pack(); //包著button,button不改變大小,pack使窗口適應button大小 f.setVisible(true); } }
運行結果:
4、CardLayout
5、GridBagLayout
綜合:
import java.awt.*; public class TenButtons { public static void main(String args[]) { Frame f=new Frame("My Frame"); f.setLayout(new GridLayout(2,1)); Panel p1=new Panel(); Panel p2=new Panel(); Panel p21=new Panel(); Panel p22=new Panel(); p1.setLayout(new BorderLayout()); p2.setLayout(new BorderLayout()); p21.setLayout(new GridLayout(2,1)); p22.setLayout(new GridLayout(2,2)); p1.add(new Button("Button"), BorderLayout.EAST); p1.add(new Button("Button"), BorderLayout.WEST); p21.add(new Button("Button")); p21.add(new Button("Button")); p1.add(p21, BorderLayout.CENTER); p2.add(new Button("Button"), BorderLayout.EAST); p2.add(new Button("Button"), BorderLayout.WEST); for(int i=0;i<4;i++){ p22.add(new Button("Button")); } p2.add(p22, BorderLayout.CENTER); f.add(p1); f.add(p2); f.setVisible(true); f.pack(); } }
運行結果:
AWT和布局管理器