(1)
布局:决定容器内的各个组件的摆放状态(组件大小及相对位置等),它由布局管理器来控制,container的默认管理器是BorderLayout。
(2)使用指定的布局方式:创建指定布局方式类的对象,然后调用容器类的setLayout()方法来指定所需的布局方式。例:setLayout(new
FlowLayout());
ps:一般Java中默认采用相对定位布局,如需要使用绝对定位布局,则应该取消容器的布局方式(setLayout(null)),然后使用
setLocation() setSize() setBounds()设置组件的大小及位置。
(3)下面分别对几种布局方式的编程加以说明。
先说课本上出现的:
1、Flowlayout
默认为从上到下从左到右依次摆放,每行均居中,自动换行,也可设置对齐方式,它是Panel、Applet的缺省布局。
组件顺序和尺寸不随窗口变化而变化。
2、BorderLayout
将容器内的空间划分为东、南、西、北、中五个方位,并指明组件所在的方位,它是Window、Dialog、Frame的缺省布局方式。
north与south有确定的高度,west与east有确定的宽度。
3、GridLayout
行列网格状布局。
这种布局方式首先放一个容纳单元的栅格,元件放到这个网格的单元个中,GridLayout构造方法:
GridLayout(int row,int
col)
GridLayout(int row,int col,int
hGap,int vGap)
其中:row:行数
col: 列数
如果某个值为零,表示这个方向可以任意扩展。
HGap、vGap表示以象素为单位的元件间隔。
元件总是充满单元格,而且随着边框的变化而变化。
补充几个课外的:
4、CardLayout
卡片叠式布局。
这种布局方式,可以用来管理两个或者更多共享同一显示区域的元件。它具有以下两个构造方法:
CardLayout()
CardLayout(int hGap,int
vGap)
样例:
package demo;
import java.awt.*;
import java.awt.event.*;
import java.*;
import java.lang.*;
public class GuiDemo extends Frame
{
//构造一个容器,放置可变的元件
Panel
cardContainer=new Panel();
//构造函数的参数为长度
TextField
jTextField1 = new TextField(30);
Button jButton1 =
new Button();
Button jButton2 =
new Button();
Button jButton3 =
new Button();
//列表框
Choice c=new
Choice();
String
ca1="按钮";
String
ca2="正文域";
//构造函数
public GuiDemo()
{
jbInit();
}
//开始代码
public static void
main(String[] args) {
GuiDemo frame = new GuiDemo();
//显示元件
frame.setVisible(true);
}
//初始化代码,这里踢出了错误
private void
jbInit()
{
//激活Windows事件
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
//设置窗口的标题,大小与布局
setTitle("元件加入的程序演示");
setSize(new Dimension(300, 200));
//所有的元件都按顺序方式布局
this.setLayout(new BorderLayout(0,3));
jTextField1.setText("您好");
jButton1.setLabel("按钮1-1");
jButton2.setLabel("按钮1-2");
jButton3.setLabel("按钮1-3");
//列表框赋初值
c.add(ca1);
c.add(ca2);
//构造下拉列表改变的事件侦听器
c.addItemListener(new java.awt.event.ItemListener()
{
public void itemStateChanged(ItemEvent e)
{myItem(e);}
}
);
//构造一个容器放列表框
Panel globarPanel=new Panel();
globarPanel.add(c);
this.add("North",globarPanel);
//cardContainer按CardLayout布局
cardContainer.setLayout(new CardLayout());
Panel p1=new Panel();
p1.add(jButton1);
p1.add(jButton2);
p1.add(jButton3);
Panel p2=new Panel();
p2.add(jTextField1);
//把两个容器都加入
cardContainer.add(ca1,p1);
cardContainer.add(ca2,p2);
this.add("Center",cardContainer);
}
//这是下拉列表改变的事件程序
void myItem(ItemEvent e)
{
((CardLayout)cardContainer.getLayout()).show(
cardContainer,(String)e.getItem());
}
//这是检测退出程序的的事件,没有这个事件窗口将无法关闭
protected void processWindowEvent(WindowEvent e) {
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
System.exit(0);
}
}
}
5、GridBayLayout
自定义网格状布局。
GridBagLayout是所有AWT布局管理器当中最复杂的,同时他的功能也是最强大的.这种现象源于它所提供的众多的可配置选项,你几乎可以完全地控制容器的布局方式.尽管复杂性很明显,只要理解了基本思想,就很容易使用GridBagLayout了.
GridBagLayout从它的名字中你也可以猜到,它同GridLayout一样,在容器中以网格形式来管理组件.但GridBagLayout功能要来得强大得多.
1、GridBagLayout管理的所有行和列都可以是大小不同的.
2、GridLayout把每个组件限制到一个单元格,而GridLayout并不这样:组件在容器中可以占据任意大小的矩形区域,
GridBagLayout通常由一个专用类来对他布局行为进行约束,该类叫GridBagConstraints.其中的所有成员都是public的,
因此要学好如何使用GridBagLayout首先要了解有那些约束变量,以及如何设置这些约束变量.
以下是GridBagConstraints的公有成员变量
public int
anchor
public int fill
public gridheight
Public gridweight
public girdx
public gridy
public Insets insets
public int ipadx
public int ipady
public double weightx
public double weighty
看起来有很多约束需要进行设置,但事实上许多约束只需设置一次,并对多个组件重用,每次添加组件时只有少数的项需要修改.
常用构造: public
GridBagLayout()
样例:
package demo;
import java.awt.*;
import java.awt.event.*;
import java.*;
import java.lang.*;
public class GuiDemo extends Frame
{
//构造函数
public GuiDemo()
{
jbInit();
}
//开始代码
public static void
main(String[] args) {
GuiDemo frame = new GuiDemo();
frame.setTitle("元件加入的程序演示");
frame.setSize(300,200);
//显示元件
frame.setVisible(true);
}
public void
makebutton(
String
name,
GridBagLayout
gridbag,
GridBagConstraints
c)
{
Button
button=new Button(name);
gridbag.setConstraints(button,c);
this.add(button);
}
//初始化代码
private void
jbInit()
{
//激活Windows事件
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
GridBagLayout gridbag=new GridBagLayout();
GridBagConstraints c=new GridBagConstraints();
this.setFont(new Font("宋体",Font.PLAIN,11));
this.setLayout(gridbag);
c.fill=GridBagConstraints.BOTH;
c.weightx=1.0;
makebutton("Bt1",gridbag,c);
makebutton("Bt2",gridbag,c);
makebutton("Bt3",gridbag,c);
c.gridwidth=GridBagConstraints.REMAINDER;
makebutton("Bt4",gridbag,c);
c.weightx=0.0;
makebutton("Bt5",gridbag,c);
c.gridwidth=GridBagConstraints.RELATIVE;
makebutton("Bt6",gridbag,c);
c.gridwidth=GridBagConstraints.REMAINDER;
makebutton("Bt7",gridbag,c);
c.gridwidth=1;
c.gridheight=2;
c.weighty=1.0;
makebutton("Bt8",gridbag,c);
c.weighty=0.0;
c.gridwidth=GridBagConstraints.REMAINDER;
c.gridheight=1;
makebutton("Bt9",gridbag,c);
makebutton("Bt10",gridbag,c);
}
//这是检测退出程序的的事件,没有这个事件窗口将无法关闭
protected void processWindowEvent(WindowEvent e) {
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
System.exit(0);
}
}
}
(凌霄)
加载中,请稍候......