【老白学 Java】Border 布局管理器
Border 布局管理器
文章来源:《Head First Java》修炼感悟。
当你向面板中放入各种各样组件时,有没有感觉到有些不同寻常。 这些组件能够很有条理的进行排列,它们是根据什么确定自己的位置和大小的呢? 本文就来聊一聊组件布局管理器 (Layout Manager)。
布局管理器
之所以组件排列得有条不紊, 实际上是背后有一个家伙在默默地做着工作,这个家伙我们叫它布局管理器。 在 Swing 的组件库中,所有容器类组件(如 Frame、Panel 等等)都有各自的布局管理器,而布局管理器又分为几种不同类型和不同的布局策略。
容器类组件中可以加入其它组件,并按照它的布局策略排列容器中的子组件;而这个容器组件又可以成为其它容器组件的子组件,并按照它的父组件的布局策略进行排列。 简单地说,组件可以嵌套。
布局管理器分为三种,BorderLayout
、FlowLayout
、BoxLayout
,下面先来看看 Border 布局对组件排列的影响。
BorderLayout
BorderLayout 是容器组件的默认布局管理器,它将容器组件划分为五个区域:East、West、South、North、Center,每个区域只能放入一个组件。
接下来演示一下在不同区域添加组件的情形,首先是 East 区域:
import javax.swing.*;
import java.awt.*;
public class BorderLayoutManager {public void go() {JFrame frame = new JFrame();// JButton button = new JButton("click me");JButton button = new JButton("click like you mean it");frame.getContentPane().add(BorderLayout.EAST, button);frame.setSize(300, 300);frame.setVisible(true);}public static void main(String[] args) {new BorderLayoutManager().go();}
}
注意,添加到 East 和 West 区域的组件会根据组件内容自动适应宽度,而高度父类容器高度一致。比如 Button 文字较多的组件要宽于文字内容较少的组件,而 Button 高度与父类容器高度保持一致。 下面是运行时的情形:
然后在 North 区域添加 Button:
import javax.swing.*;
import java.awt.*;
public class BorderLayoutManager {public void go() {JFrame frame = new JFrame();JButton button = new JButton("there is no spoon...");frame.getContentPane().add(BorderLayout.NORTH, button);frame.setSize(300, 300);frame.setVisible(true);}public static void main(String[] args) {new BorderLayoutManager().go();}
}
与 East 和 West 类似,添加到 South 和 North 区域的组件,与父类容器宽度一致,而高度根据 Button 文字内容的高度决定。 下面是运行时的情形:
最后在五个区域都加入 Button:
import javax.swing.*;
import java.awt.*;
public class BorderLayoutManager {public void go() {JFrame frame = new JFrame();JButton button_e = new JButton("East");JButton button_w = new JButton("West");JButton button_n = new JButton("North");JButton button_s = new JButton("South");JButton button_c = new JButton("Center");frame.getContentPane().add(BorderLayout.EAST, button_e);frame.getContentPane().add(BorderLayout.WEST, button_w);frame.getContentPane().add(BorderLayout.NORTH, button_n);frame.getContentPane().add(BorderLayout.SOUTH, button_s);frame.getContentPane().add(BorderLayout.CENTER, button_c);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(300, 300);frame.setVisible(true);}public static void main(String[] args) {new BorderLayoutManager().go();}
}
可以看到,中心区域只能是周围四个区域分配后剩余的空间。 如果添加组件时没有指定区域,则默认添加到 Center 区域。 假如只有 Center 区域添加了组件,这个组件会充斥整个面板,就像这样:
import javax.swing.*;
import java.awt.*;
public class BorderLayoutManager {public void go() {JFrame frame = new JFrame();JButton button_c = new JButton("哈哈~我独占整个面板");frame.getContentPane().add(BorderLayout.CENTER, button_c);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(300, 300);frame.setVisible(true);}public static void main(String[] args) {new BorderLayoutManager().go();}
}
BorderLayout 布局特点
- 分为五个区域,每个区域只能放入一个组件;
- 组件的宽度和高度,除了与自身有关还与父类容器的宽度和高度有关;
- 优先确定 South 和 North 区域组件大小;
- 然后确定 East 和 West 区域组件大小;
- 最后确定 Center 区域组件大小;
- 如果仅有 Center 区域加入组件,组件会充斥整个面板。
内容预告
下一篇文章继续讨论另一种布局管理器 FlowLayout,它会有怎样的布局策略,老白届时为你揭晓。
《 上一篇 简单位移动画 | 下一篇 Flow 布局管理器 》 |
---|