组件在容器中位置的确定
容器坐标系方式确定组件位置
- 容器界面上的坐标系是一个二维网格,它可以标识容器界面上每个点的坐标位置。坐标单位用像素来度量,一个像素是一台显示器的最小分辨单位。坐标系由一个 x 坐标(水平坐标)和一个 y 坐标(垂直坐标)组成。在默认状态下原点(0,0)为容器界面左上角坐标,因此,x 坐标是从左向右移动的水平距离,y 坐标是从上向下移动的垂直距离。
- 容器默认采用布局管理器进行组件布局,如选用坐标方式布局组件,首先需要调用容器方法“setLayout(null)”进行设置。之后对要布局的组件,调用其祖先类 Component 的 setLocation 或 setBounds 方法来确定在容器中的位置。当容器整体移动或调整尺寸时,嵌入容器的组件在容器中的相对位置和尺寸并不改变。
布局管理器方式确定组件位置
FlowLayout
FlowLayout 是 Panel、Applet 容器的默认布局管理器,其对组件布局的规律是从上到下、从左到右。如果容器足够宽,第一个组件先添加到容器第一行的最左边,后续的组件依次添加到上一个组件的右边。如果当前行已放置不下组件,则放置到下一行的最左边。当容器尺寸改变时,组件的尺寸不会变动。
import java.awt.*;
public class FlowLayoutDemo {
public static void main(String[] args) {
Frame f = new Frame("FlowLayout Sample");
f.setLayout(new FlowLayout());
f.add(new Button("one"));
f.add(new Button("two"));
f.add(new Button("three"));
f.add(new Button("four"));
f.setSize(400,200);
f.setVisible(true);
}
}
BorderLayout
BorderLayout 是 Window、Frame 和 Dialog 的默认布局管理器。BorderLayout 布局管理器把容器分成五个区域:North、South、East、West 和 Center,每个区域只能放置一个组件。在使用 BorderLayout 的时候,如果容器的尺寸发生变化,组件的变化规律为:组件相对位置不变,大小发生变化。
import java.awt.*;
public class BoderLayoutDemo {
public static void main(String[] args) {
Frame f = new Frame("BorderLayout Sample");
f.setLayout(new BorderLayout());
Button north = new Button("North");
Button south = new Button("South");
Button west = new Button("West");
Button east = new Button("East");
Button center = new Button("Center");
f.add(north,BorderLayout.NORTH);
f.add(south,BorderLayout.SOUTH);
f.add(west,BorderLayout.WEST);
f.add(east,BorderLayout.EAST);
f.add(center,BorderLayout.CENTER);
f.setSize(400,400);
f.setVisible(true);
}
}
GirdLayout
GirdLayout 使容器中各个组件呈网格状布局,平均占据容器的空间。GirdLayout 的特点是:将容器界面分成若干行和列,每个格大小一致,再调用容器方法 add 加入组件,按从左到右、从上到下顺序进行组件布局。因而当容器尺寸改变时,组件尺寸也相应调整。
import java.awt.*;
public class GridLayoutDemo {
public static void main(String[] args) {
Frame f = new Frame("GridLayout Sample");
f.setSize(300,200);
f.setLayout(new GridLayout(2,3)); //布局有两行三列
f.add(new Button("1"));
f.add(new Button("2"));
f.add(new Button("3"));
f.add(new Button("4"));
f.add(new Button("5"));
f.add(new Button("6"));
f.setVisible(true);
}
}
CardLayout
CardLayout 布局管理器能够处理两个以上组件共享同一显示空间的情况。它把容器分成许多层,每层的显示空间占据整个容器的大小,但是每层只允许放置一个组件,如果要放置多个组件,则先加入一个 Panel 对象,再将 Panel 对象加入层中。CardLayout 就像一副叠得整整齐齐的扑克牌,但一次只能看见最上面的一张牌,每一张牌就相当于布局管理器中的一层。
import java.awt.*;
public class CardLayoutDemo {
public static void main(String[] args) {
Frame f = new Frame("CardLayout Sample");
CardLayout card = new CardLayout();
f.setLayout(card);
f.setSize(400,300);
f.add(new Button("Button1"),"c1"); //用字符串c1作为本层的索引标识
f.add(new Button("Button2"),"c2"); //用字符串c2作为本层的索引标识
f.add(new Button("Button3"),"c3"); //用字符串c3作为本层的索引标识
card.show(f,"c3");
f.setVisible(true);
}
}
GirdBagLayout
GirdBagLayout 一改其他的外观管理器的死板模样,具有很多的灵活性。GirdBagLayout 通过类 GirdBagConstraints 的帮助,按照设计的意图,改变组件的大小,把它们摆在设计者希望摆放的位置上。在 GirdBagLayout 中,每个组件都有一个 GirdBagConstraints 对象来给出它的大小和摆放的位置。在使用 GirdBagLayout 的时候,最重要的就是学会类 GirdBagConstraints 的使用方法,学会如何设置组件的大小、位置等限制条件。
import java.awt.*;
public class GridBagLayoutDemo {
public static void main(String[] args) {
Frame f = new Frame("GridBagLayout Sample");
f.setSize(320, 180); //设置窗口的大小
GridBagConstraints gbc = new GridBagConstraints(); //使用类GridBagConstraints
f.setLayout(new GridBagLayout()); //设定外观管理器位GridBagLayout外观管理器
gbc.fill = GridBagConstraints.BOTH; //所有的按钮都会把分配的剩余空间填满
gbc.gridheight = 1; //设置第一个按钮显示属性
gbc.gridwidth = 1;
Button button1 = new Button("东");
((GridBagLayout)f.getLayout()).setConstraints(button1, gbc);
f.add(button1);
gbc.gridwidth = GridBagConstraints.REMAINDER; //设置第二个按钮的gridwidth,gridheigth保持不变
Button button2 = new Button("西");
((GridBagLayout)f.getLayout()).setConstraints(button2, gbc);
f.add(button2);
gbc.gridheight = 4; //设置第三个按钮显示属性
gbc.gridwidth = 1;
Button button3 = new Button("南");
((GridBagLayout)f.getLayout()).setConstraints(button3, gbc);
f.add(button3);
gbc.gridheight = 2; //设置第四个按钮显示属性
gbc.gridwidth = 1;
Button button4 = new Button("北");
((GridBagLayout)f.getLayout()).setConstraints(button4, gbc);
f.add(button4);
gbc.gridwidth = GridBagConstraints.REMAINDER; //设置第五个按钮显示属性
Button button5 = new Button("中");
((GridBagLayout)f.getLayout()).setConstraints(button5, gbc);
f.add(button5);
gbc.insets = new Insets(5, 6, 7, 8); //设置第六个按钮显示属性
Button button6 = new Button("GridBagLayoutDemo");
((GridBagLayout)f.getLayout()).setConstraints(button6, gbc);
f.add(button6);
f.setVisible(true);
}
}