參考文獻(xiàn):《Java瘋狂講義》(第三版)
知識(shí)點(diǎn):
Swing并沒有完全替代AWT兔院,而是建立在AWT基礎(chǔ)之上,Swing僅提供了能力更強(qiáng)大的用戶界面組件斤寂,即使是完全采用Swing編寫的GUI程序仿贬,也依然需要使用AWT的事件處理機(jī)制涝焙。
所有和AWT編程有關(guān)的類都放在java.awt包中以及他的子包中,
AWT 編程中有兩個(gè)基類:Component和Menu'Component。
Component代表一個(gè)能以圖形化方式顯示出來距潘,并可與用戶交互的對(duì)象炼列。
TextField代表一個(gè)文本框
......
import java.awt.*;
public class FrameTest{
public static void main(String[] args){
Frame f=new Frame("Hello AWT");
f.setBounds(30,30,250,200);
f.setVisible(true);
}
}
Panel是AWT另一個(gè)典型的容器,它代表不能獨(dú)立存在绽昼,必須存放在其他容器中的容器唯鸭。
Panel是一個(gè)矩形區(qū)域,該區(qū)域內(nèi)可盛裝其他組件硅确。Panel容器存在的意義在于為其他組件提供空間目溉,其特點(diǎn)如下:
1、可作為容器來盛裝其他組件菱农,為放置組件提供空間缭付。
2、不能單獨(dú)存在循未,必須放置到其布局管理器陷猫。
3、默認(rèn)使用FlowLayout作為其布局管理器的妖。
ScrollPanel
帶滾動(dòng)條的Panel
布局管理器
為了使生成的圖形用戶界面具有良好的平臺(tái)無(wú)關(guān)性旁仿,Java語(yǔ)言提供了布局管理器這個(gè)工具來管理組件在容器中的布局,而不使用直接設(shè)置組件位置和大小的方式叫乌。
對(duì)于不同的組件而言责静,它們都有一個(gè)最佳大小,這個(gè)最佳大小通常是平臺(tái)相關(guān)的星虹,程序在不同平臺(tái)上運(yùn)行時(shí)零抬,相同內(nèi)容的大小可能不一樣镊讼。如果讓程序員手動(dòng)控制每個(gè)組件的大小,位置平夜,這將給編程帶來的巨大的困難蝶棋,為了解決這個(gè)問題,Java提供了LayoutManager忽妒,LayoutManager可以根據(jù)運(yùn)行平臺(tái)來調(diào)整組件的大小玩裙,程序員要做的,只是為容器選擇合適的布局管理器锰扶。
所有AWT容器都有默認(rèn)的布局管理器献酗,如果沒有為容器指定布局管理器,則該容器使用默認(rèn)的布局管理器坷牛。
setLayout(LayoutManager Lm)罕偎;
FlowerLayout布局管理器
BoderLayout布局管理器
注意:
1、當(dāng)向使用BorderLayout布局管理器的容器中添加組件時(shí)京闰,需要指定要添加到哪個(gè)區(qū)域颜及,如果沒有指定,則默認(rèn)添加到中間蹂楣。
2俏站、如果想同一個(gè)區(qū)域中添加多個(gè)組件時(shí)候,后放入的組件會(huì)覆蓋先放入的組件
知識(shí)點(diǎn):
BorderLayout最多只能放置5個(gè)組件痊土,但可以放置少于5個(gè)組件肄扎,如果么某個(gè)區(qū)域沒有放置組件,該區(qū)域并不會(huì)出現(xiàn)空白赁酝,旁邊區(qū)域的組件會(huì)自動(dòng)占據(jù)該區(qū)域犯祠,從而保證窗口有較好的外觀。
雖然BorderLayout最多放置5個(gè)組件酌呆,但因?yàn)槿萜饕彩且粋€(gè)組件衡载,所以我們可以先向Panel里添加多個(gè)組件,再把Panel添加到BorderLayout布局管理器中隙袁,從而讓BorderLayout布局管理中實(shí)際組件數(shù)遠(yuǎn)遠(yuǎn)超過5個(gè)痰娱。
GridLayout布局管理器
GridLayout布局管理器將容器分割成縱橫線分隔的網(wǎng)絡(luò),每個(gè)網(wǎng)絡(luò)所占的區(qū)域大小相同菩收。當(dāng)向使用GirdLayout布局管理器的容器中添加組件時(shí)梨睁,默認(rèn)從左向右、從上到下依次添加到每個(gè)網(wǎng)絡(luò)中娜饵。
與FlowLayout不同的是坡贺,放置在GridLayout布局管理器中組件的大小由組件所處的區(qū)域來決定。
import java.awt.*;
import java.applet.Applet;
public class GridLayoutTest{
public static void main(String[] args){
Frame f=new Frame("計(jì)算器");
Panel p1=new Panel();
p1.add(new TextField(30));
f.add(p1,"North");
Panel p2=new Panel();
//設(shè)置Panel使用GridLayout布局管理器
String[] name={"0","1","2","3","4","5","6","7","8","9"};
for(int i=0;i
p2.add(new Button(name[i]));
}
f.add(p2);
f.pack();
f.setVisible(true);
}
}
GridBagLayout布局管理器
在GridBagLayout布局管理器中,一個(gè)組件可以跨越一個(gè)或多個(gè)網(wǎng)絡(luò)拴念,并可以設(shè)置各網(wǎng)絡(luò)的大小互不相同,從而增加了布局的靈活性褐缠。
當(dāng)窗口大小發(fā)生變化時(shí)政鼠,GridBagLayout布局管理器也可以準(zhǔn)確地控制窗口各部分的拉伸。
為了處理GridBagLayout中的GUI組件的大小队魏、跨越性公般,Java提供了GridBagConstraints對(duì)象,該對(duì)象與特定的GUI組件關(guān)聯(lián)胡桨,用于控制該GUI組件的大小官帘、跨越性。
使用GridBagLaoyout步驟如下:
1昧谊、創(chuàng)建GridBagLayout布局管理器刽虹,并指定GUI容器使用該布局管理器;
2呢诬、創(chuàng)建GridBagConstraints對(duì)象涌哲,并設(shè)置該對(duì)象的相關(guān)屬性;
3尚镰、調(diào)用GridBagLayout對(duì)象的方法來建立GridBagConstraints對(duì)象和受控制組件之間的關(guān)聯(lián)
4阀圾、添加組件,與普通布局管理器添加組件的方法完全一樣狗唉。
重復(fù)步驟2~4初烘;
import java.awt.*;
import java.applet.Applet;
public class GridBagTest{
private Frame f= new Frame("Test");
private GridBagLayout gb=new GridBagLayout();
private GridBagConstraints gbc=new GridBagConstraints();
private Button[] bs =new Button[10];
public void init(){
f.setLayout(gb);
for(int i=0;i
bs[i]=new Button("按鈕"+i);}
gbc.fill=GridBagConstraints.BOTH;
gbc.weightx=1;
addButton(bs[0]);
addButton(bs[1]);
addButton(bs[2]);
gbc.gridwidth=GridBagConstraints.REMAINDER;
addButton(bs[3]);
gbc.weightx=0;
addButton(bs[4]);
gbc.gridwidth=2;
addButton(bs[5]);
gbc.gridwidth=1;
gbc.gridheight=2;
gbc.gridwidth=GridBagConstraints.REMAINDER;
addButton(bs[6]);
gbc.gridwidth=1;
gbc.gridheight=2;
gbc.weighty=1;
addButton(bs[7]);
gbc.weighty=0;
gbc.gridwidth=GridBagConstraints.REMAINDER;
gbc.gridheight=1;
addButton(bs[8]);
addButton(bs[9]);
f.pack();
f.setVisible(true);
}
private void addButton(Button button){
gb.setConstraints(button,gbc);
f.add(button);
}
public static void main(String[] args){
new GridBagTest().init();
}
}
CardLayout布局管理器
CardLayout布局管理器以時(shí)間而非空間來管理它里面的組件,它將加入容器的所有組件看成一張卡片分俯,每次只有最上面的那個(gè)Compinent才可見肾筐。
import java.awt.*;
import java.awt.event.ActionListener;
public class CardLayoutText{
Frame f=new Frame("測(cè)試窗口");
String[] names={"第一張","第二張","第三張","第四張","第五張"};
Panel pl=new Panel();
public void init(){
final CardLayout c=new CardLayout();
pl.setLayout(c);
for(int i=0;i
pl.add(names[i],new Button(names[i]));
}
//--------------------------------------------------
Panel p=new Panel();
ActionListener listener = e ->{
switch(e.getActionCommand()){
case "last":
c.previous(pl);
break;
case "next":
c.next(pl);
break;
case "第一張":
c.first(pl);
break;
case "最后一張":
c.last(pl);
break;
case "第三張":
c.show(pl,"第三張");
break;
}
};
Button previous=new Button("last");
previous.addActionListener(listener);
Button next=new Button("next");
next.addActionListener(listener);
Button first=new Button("第一張");
first.addActionListener(listener);
Button last =new Button("最后一張");
last.addActionListener(listener);
Button third=new Button("第三張");
third.addActionListener(listener);
p.add(previous);
p.add(next);
p.add(first);
p.add(last);
p.add(third);
f.add(p);
f.add(pl);
//f.add(p,BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
}
public static void main(String[] args){
new CardLayoutText().init();
}
}
Panel是AWT另一個(gè)典型的容器,它代表不能獨(dú)立存在澳迫,必須存放在其他容器中的容器局齿。