1.AWT 和Swing
AWT是SUN在jdk中提供的基本的GUI类库,被称为Abstract Window Toolkit。AWT是窗口框架,它从不同平台的窗口系统中抽取共同组件,当程序运行时,将这些组件的创建和动作委托给所在的运行平台。也就是说,JVM调用操作系统本地的图形界面来创建和平台一致的对等体。
AWT的不足:
(1)界面丑陋,功能有限
(2)不能使用特定操作系统上复杂的图形界面组件,最多只能使用4种字体;
(3)AWT使用非常笨拙的、非面向对象的编程模式。
Swing是新的Java GUI库,Swing、AWT、辅助功能API、2D API和拖放API共同组成了JFC(Java Foundation Classes)。Swing组件全面代替了Java1.0中的AWT组件,但是使用的仍然是AWT事件模型。
2.AWT组件
所有和AWT变成相关的类,都放在java.awt包及子包中。AWT图形组件大致结构如下:
3.AWT容器
容器Container是Component的一个子类,可以盛装普通的Component。F
Window:可独立存在的顶级窗口;
Panel:可作为容器,但是不能独立存在,必须放在其它容器中。常用组件。
Frame:Window子类,有标题,能通过拖拉改变窗口的位置和大小;初始化不可见,通过setVisible(true),显示;默认使用BorderLayout作为布局管理器(下一节介绍)。很常用。
ScrollPane:带滚动条的容器,不能单独存在。
测试代码:
import java.awt.Button;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.TextField;
public class TestFrame {
public static void main(String[] args) {
Frame f = new Frame("测试窗口");
Panel p = new Panel();
//添加组件
p.add(new TextField());
p.add(new Button("单机我"));
//添加到Frame
f.add(p);
//frame位置
f.setBounds(30,30,250,200);
//frame可见
f.setVisible(true);
}
}
效果图:
4.布局管理器Layout
容器里面放组件,但是组件的布局由布局管理器控制,上面的示例代码中没有设置布局,使用默认的布局管理器。
AWT常用布局管理器:
(1)FlowLayout:组件像水流一样向某方向排列,遇到边界就折回。默认方向向左。
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
public class TestFlowLayout {
public static void main(String[] args) {
Frame f = new Frame("FlowLayout");
//设置FlowLayout,左对齐
f.setLayout(new FlowLayout(FlowLayout.LEFT));
//添加10个按钮
for(int i=0;i<10;i++){
f.add(new Button("button" + i));
}
f.setBounds(30, 30, 300, 200);
f.setVisible(true);
}
}
(2)BorderLayout:将容器分为EAST、SOUTH、WEST、NORTH和CENTER五个区域,组件可以被放置在其中的任意一个。
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
public class TestBorderLayout {
public static void main(String[] args) {
Frame f = new Frame("Border");
//设置BorderLayout,水平间距30,垂直间距20
f.setLayout(new BorderLayout(30,20));
f.add(new Button("南"), BorderLayout.SOUTH);
f.add(new Button("北"), BorderLayout.NORTH);
f.add(new Button("东"), BorderLayout.EAST);
f.add(new Button("西"), BorderLayout.WEST);
f.add(new Button("中"), BorderLayout.CENTER);
f.add(new Button("中2"), BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
}
效果图:
重复添加位置,后一个会覆盖前面,5个位置不用全部添加,BorderLayout会自动调整。
(3)GridLayout:将容器分割为纵横线分割的网格,每个网格一样大。
这个好理解。
(4)GridBagLayout:功能最强大,也是最复杂的布局管理器,与GridLayout不同的是:GridBagLayout中的组件可以跨越多个网格,并可以设置各个网格大小不同。
为了控制容器中的组件大小和跨越性,java提供了GridBagConstraints。
示例代码:
package se.example.awt;
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
public class TestGridBag {
private Frame f = new Frame("测试窗口");
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.length ; i++ )
{
bs[i] = new Button("按钮" + i);
}
//所有组件都可以横向、纵向上扩大
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 1;
addButton(bs[0]);
addButton(bs[1]);
addButton(bs[2]);
//该GridBagConstraints控制的GUI组件将会成为横向最后一个元素
gbc.gridwidth = GridBagConstraints.REMAINDER;
addButton(bs[3]);
//该GridBagConstraints控制的GUI组件将横向上不会扩大
gbc.weightx = 0;
addButton(bs[4]);
//该GridBagConstraints控制的GUI组件将横跨2个网格
gbc.gridwidth = 2;
addButton(bs[5]);
//该GridBagConstraints控制的GUI组件将横跨1个网格
gbc.gridwidth = 1;
//该GridBagConstraints控制的GUI组件将纵向跨2个网格
gbc.gridheight = 2;
//该GridBagConstraints控制的GUI组件将会成为横向最后一个元素
gbc.gridwidth = GridBagConstraints.REMAINDER;
addButton(bs[6]);
//该GridBagConstraints控制的GUI组件将横向跨越一个网格,纵向跨越2个网格。
gbc.gridwidth = 1;
gbc.gridheight = 2;
//该GridBagConstraints控制的GUI组件纵向扩大的权重是1
gbc.weighty = 1;
addButton(bs[7]);
//设置下面的按钮在纵向上不会扩大
gbc.weighty = 0;
//该GridBagConstraints控制的GUI组件将会成为横向最后一个元素
gbc.gridwidth = GridBagConstraints.REMAINDER;
//该GridBagConstraints控制的GUI组件将纵向上横跨1个网格
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) {
TestGridBag tgb = new TestGridBag();
tgb.init();
}
}
效果图:
(5)CardLayout:以时间而非空间来管理它的组件,将加入容器的所有组件看做一叠卡片,每次只有上面的那个组件才可见。并提供方法控制显示的组件。
CardLayout的常用方法:first(Container c);last(Container c);previous(Container c);next(Container c);show(Container c ,String name)。
(6)BoxLayout:Swing引入的一个新的布局管理器。保留了GridBagLayout的许多优点,却更简单。可以在垂直和水平方向上摆放组件。
package se.example.awt;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import javax.swing.Box;
public class TestBoxLayout {
private Frame f = new Frame("测试");
//定义水平摆放组件的Box对象
private Box horizontal = Box.createHorizontalBox();
//定义垂直摆放组件的Box对象
private Box vertical = Box.createVerticalBox();
public void init()
{
horizontal.add(new Button("水平按钮一"));
horizontal.add(Box.createHorizontalGlue());
horizontal.add(new Button("水平按钮二"));
//水平方向不可拉伸的间距,其宽度为10px
horizontal.add(Box.createHorizontalStrut(10));
horizontal.add(new Button("水平按钮三"));
vertical.add(new Button("垂直按钮一"));
vertical.add(Box.createVerticalGlue());
vertical.add(new Button("垂直按钮二"));
//垂直方向不可拉伸的间距,其高度为10px
vertical.add(Box.createVerticalStrut(10));
vertical.add(new Button("垂直按钮三"));
f.add(horizontal , BorderLayout.NORTH);
f.add(vertical);
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
new TestBoxLayout().init();
}
}
效果图: