参考文献:《Java疯狂讲义》(第三版)
知识点:
Swing并没有完全替代AWT,而是建立在AWT基础之上,Swing仅提供了能力更强大的用户界面组件,即使是完全采用Swing编写的GUI程序,也依然需要使用AWT的事件处理机制。
所有和AWT编程有关的类都放在java.awt包中以及他的子包中,
AWT 编程中有两个基类:Component和Menu'Component。
Component代表一个能以图形化方式显示出来,并可与用户交互的对象。
TextField代表一个文本框
......
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另一个典型的容器,它代表不能独立存在,必须存放在其他容器中的容器。
Panel是一个矩形区域,该区域内可盛装其他组件。Panel容器存在的意义在于为其他组件提供空间,其特点如下:
1、可作为容器来盛装其他组件,为放置组件提供空间。
2、不能单独存在,必须放置到其布局管理器。
3、默认使用FlowLayout作为其布局管理器。
ScrollPanel
带滚动条的Panel
布局管理器
为了使生成的图形用户界面具有良好的平台无关性,Java语言提供了布局管理器这个工具来管理组件在容器中的布局,而不使用直接设置组件位置和大小的方式。
对于不同的组件而言,它们都有一个最佳大小,这个最佳大小通常是平台相关的,程序在不同平台上运行时,相同内容的大小可能不一样。如果让程序员手动控制每个组件的大小,位置,这将给编程带来的巨大的困难,为了解决这个问题,Java提供了LayoutManager,LayoutManager可以根据运行平台来调整组件的大小,程序员要做的,只是为容器选择合适的布局管理器。
所有AWT容器都有默认的布局管理器,如果没有为容器指定布局管理器,则该容器使用默认的布局管理器。
setLayout(LayoutManager Lm);
FlowerLayout布局管理器
BoderLayout布局管理器
注意:
1、当向使用BorderLayout布局管理器的容器中添加组件时,需要指定要添加到哪个区域,如果没有指定,则默认添加到中间。
2、如果想同一个区域中添加多个组件时候,后放入的组件会覆盖先放入的组件
知识点:
BorderLayout最多只能放置5个组件,但可以放置少于5个组件,如果么某个区域没有放置组件,该区域并不会出现空白,旁边区域的组件会自动占据该区域,从而保证窗口有较好的外观。
虽然BorderLayout最多放置5个组件,但因为容器也是一个组件,所以我们可以先向Panel里添加多个组件,再把Panel添加到BorderLayout布局管理器中,从而让BorderLayout布局管理中实际组件数远远超过5个。
GridLayout布局管理器
GridLayout布局管理器将容器分割成纵横线分隔的网络,每个网络所占的区域大小相同。当向使用GirdLayout布局管理器的容器中添加组件时,默认从左向右、从上到下依次添加到每个网络中。
与FlowLayout不同的是,放置在GridLayout布局管理器中组件的大小由组件所处的区域来决定。
import java.awt.*;
import java.applet.Applet;
public class GridLayoutTest{
public static void main(String[] args){
Frame f=new Frame("计算器");
Panel p1=new Panel();
p1.add(new TextField(30));
f.add(p1,"North");
Panel p2=new Panel();
//设置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布局管理器中,一个组件可以跨越一个或多个网络,并可以设置各网络的大小互不相同,从而增加了布局的灵活性。
当窗口大小发生变化时,GridBagLayout布局管理器也可以准确地控制窗口各部分的拉伸。
为了处理GridBagLayout中的GUI组件的大小、跨越性,Java提供了GridBagConstraints对象,该对象与特定的GUI组件关联,用于控制该GUI组件的大小、跨越性。
使用GridBagLaoyout步骤如下:
1、创建GridBagLayout布局管理器,并指定GUI容器使用该布局管理器;
2、创建GridBagConstraints对象,并设置该对象的相关属性;
3、调用GridBagLayout对象的方法来建立GridBagConstraints对象和受控制组件之间的关联
4、添加组件,与普通布局管理器添加组件的方法完全一样。
重复步骤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布局管理器以时间而非空间来管理它里面的组件,它将加入容器的所有组件看成一张卡片,每次只有最上面的那个Compinent才可见。
import java.awt.*;
import java.awt.event.ActionListener;
public class CardLayoutText{
Frame f=new Frame("测试窗口");
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另一个典型的容器,它代表不能独立存在,必须存放在其他容器中的容器。