在讨论每个 Swing 组件之前,首先介绍一下如何把这些组件排列到一个框架内。
通常,组件放置在容器内,布局管理器决定容器中的组件具体放置的位置和大小。
如果我们在设计时没有特别指定使用哪种布局管理器,那么就会使用默认布局管理器。默认布局管理器的层次关系如下图:
那么我们现在开始介绍几个常用的布局管理器
流布局管理器(flow layout manager)
流布局管理器是面板的默认布局管理器。它默认的对齐方式是居中对齐。
构造方法
方法名 | 说明 |
---|---|
FlowLayout () | 创建一个新的流布局管理器,居中对齐,默认的水平和垂直间距是 5 个单位 |
FlowLayout (int align) | 创建一个新的流布局管理器,指定对齐方式,默认的水平和垂直间距是 5 个单位 |
FlowLayout (int align, int hgap, int vgap) | 创建一个新的流布局管理器,可以指定对齐方式以及水平和垂直间距 |
示例代码:
package flowlayouttest;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JButton;
public class FlowLayoutDemo {
public static void main(String[] args)
{
JFrame frame = new JFrame("FlowLayoutDemo");
frame.setBounds(500, 200, 300, 200);
// 更改默认布局管理器为FlowLayout
frame.setLayout(new FlowLayout());
for (int i = 0; i < 5; i++)
{
frame.add(new JButton("按钮" + i));
}
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
运行结果截图:
边框布局管理器(border layout manager)
边框布局管理器是每个 JFrame 的内容窗格的默认布局管理器。流布局管理器完全控制每个组件的放置位置,边框组件则不然,它允许为每个组件选择一个放置位置。可以选择把组件放在内容窗格的中部、北部、东部、南部 或者 西部。
例如:
frame.add(component,BorderLayout.SOUTH);
先放置边缘组件,剩余的可用空间由中间组件占据。当容器被缩放时,边缘组件的尺寸不会改变,而中部组件的尺寸大小会发生变化。在添加组件时可以指定 BorderLayout 类中的 CENTER、NORTH、SOUTH、EAST 和 WEST 常量。如果没有提供任何值,系统默认为 CENTER。
与流布局不同,边框布局会扩展所有组件的尺寸以便填满可用空间(流布局将维持每个组件的最佳尺寸)。这样的话,将一个按钮添加到容器中就会出现问题:按钮扩展至填满框架的整个某区域。而且再将另外的一个按钮填入该区域就会覆盖原按钮。
解决这个问题的常见方法就是使用另外一个面板(panel)。例如,将屏幕底部的三个按钮全部包含在一个面板中。
想要得到这种配置效果,首先要创建一个新的 JPanel 对象,然后逐一将按钮添加到面版中。面板的默认布局管理器是 FlowLayout,这恰恰符合我们的需求。
JPanel panel = new JPanel();
panel.add(yellowButton);
panel.add(blueButton);
panel.add(redButton);
frame.add(panel,BorderLayout.SOUTH);
边框布局管理器构造方法
方法名 | 说明 |
---|---|
BorderLayout () | 创建一个组件之间没有间距的新边框布局 |
BorderLayout (int hgap, int vgap) | 创建一个组件之间有指定间距的新边框布局 |
示例代码:
package borderlayouttest;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JPanel;
public class BorderLayoutDemo {
public static void main(String[] args)
{
JFrame frame = new JFrame("BorderLayoutDemo");
JPanel panel = new JPanel();
panel.add(new JButton("yellow"));
panel.add(new JButton("blue"));
panel.add(new JButton("red"));
frame.setBounds(500, 200, 300, 200);
frame.setLayout(new BorderLayout(10, 10));
frame.add(new JButton("北"), BorderLayout.NORTH);
frame.add(new JButton("东"), BorderLayout.EAST);
frame.add(panel,BorderLayout.SOUTH);
frame.add(new JButton("西"), BorderLayout.WEST);
frame.add(new JButton("中"));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
运行结果截图:
网格布局(grid layout manager)
网格布局就像电子数据表一样,按行列排列所有的组件。不过它的每个单元格大小都是一样的。
构造方法
方法名 | 说明 |
---|---|
GridLayout (int rows, int columns) | 创建具有指定行数和列数的网格布局 |
GridLayout (int rows, int columns, int hgap, int vgap) | 创建具有指定行数和列数的网格布局,并且可以指定水平、垂直间距 |
例如,在网格布局对象的构造器中,需要指定行数和列数:
panel.setLayout(new GridLayout(3, 3));
添加组件,从第一行的第一列开始,然后是第一行的第二列,以此类推。
panel.add(new JButton("1"));
panel.add(new JButton("2"));
示例代码:
package gridlayouttest;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JButton;
public class GridLayoutDemo {
public static void main(String[] args)
{
JFrame frame = new JFrame("GridLayoutDemo");
frame.setBounds(500, 200, 300, 200);
// 更改默认布局管理器为GridLayout
frame.setLayout(new GridLayout(3, 3));
for (int i = 0; i < 9; i++)
{
frame.add(new JButton("按钮" + (i+1)));
}
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
运行结果截图:
实际上这样整齐的布局极少。在大多数情况下,只有一行或一列的网格布局比较有用。