javajava 网格布局管理器器中使用GridBagLayout时,出现了如下错误。详见问题补充。

用户名:zhangjunhd
文章数:110
评论数:893
访问量:3450293
注册日期:
阅读量:1297
阅读量:3317
阅读量:584903
阅读量:470425
51CTO推荐博文
当选择使用JPanel和顶层容器的content pane时,需要考虑布局管理。JPanel缺省是初始化一个FlowLayout,而content pane缺省是初始化一个BorderLayout。
下面将分别介绍几种最常用的布局管理器:FlowLayout、BorderLayout、BoxLayout、CardLayout、GridLayout和GridBagLayout。
每一个布局管理器都会有一个代码演示,xxxLayoutDemo.java(见附件)。这些文件主要有三个方法组成:
addComponentsToPane()提供布局逻辑(依据不同的布局管理器和UI内容)。
public static void addComponentsToPane(Container pane) {。。。}
createAndShowGUI()实例化一个JFrame,通过它的ContentPane加载布局逻辑内容。
private static void createAndShowGUI() {
Create and set up the window.
&&& JFrame frame = new JFrame("FlowLayoutDemo");
&&& frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
&&& // Set
up the content pane.
&&& addComponentsToPane(frame.getContentPane());
Display the window.
&&& frame.pack();
&&& frame.setVisible(true);
main()程序入口,单独起一个线程,实例化UI。
public static void main(String[] args) {
&&& javax.swing.SwingUtilities.invokeLater(new Runnable() {
&&&&&& public void run() {
&&&&&&&&&& createAndShowGUI();
FlowLayout
FlowLayout类是最简单的布局管理器。它按照和页面上排列单词的类似方式来安排组件----从左到右,直至没有多余的空间,然后转到下一行。
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
src="../attachment/925707.jpg" alt="" border="0" />
内容面板代码:
public static void addComponentsToPane(Container pane) {
&&& pane.setLayout(new FlowLayout());
&&& pane.add(new JButton("Button 1"));
&&& pane.add(new JButton("Button 2"));
&&& pane.add(new JButton("Button 3"));
&&& pane.add(new JButton("Long-Named Button 4"));
&&& pane.add(new JButton("5"));
BorderLayout
一个BorderLayout对象将界面分成五大区域,分别用BorderLayout类的静态常量指定:
-PAGE_START
-LINE_START
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
src="../attachment/938944.jpg" alt="" border="0" />
内容面板代码:
public static void addComponentsToPane(Container pane) {&&&&&&
&&& JButton button = new JButton("Button 1 (PAGE_START)");
&&& pane.add(button, BorderLayout.PAGE_START);&&&&&
&&& button = new JButton("Button 2 (CENTER)");
&&& button.setPreferredSize(new Dimension(200,
&&& pane.add(button, BorderLayout.CENTER);&&&
&&& button = new JButton("Button 3 (LINE_START)");
&&& pane.add(button, BorderLayout.LINE_START);&&&&&
&&& button = new JButton("Long-Named Button 4 (PAGE_END)");
&&& pane.add(button, BorderLayout.PAGE_END);&&&&&&
&&& button = new JButton("5 (LINE_END)");
&&& pane.add(button, BorderLayout.LINE_END);
BoxLayout可以将组件由上至下或由左至右依次加入当前面板。
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
src="../attachment/950930.jpg" alt="" border="0" />
内容面板代码:
public static void addComponentsToPane(Container pane) {
&&& JPanel xPanel = new JPanel();
&&& xPanel.setLayout(new
BoxLayout(xPanel, BoxLayout.X_AXIS));
&&& addButtons(xPanel);
&&& JPanel yPanel = new JPanel();
&&& yPanel.setLayout(new
BoxLayout(yPanel, BoxLayout.Y_AXIS));
&&& addButtons(yPanel);
&&& pane.add(yPanel, BorderLayout.PAGE_START);
&&& pane.add(xPanel, BorderLayout.PAGE_END);
private static void addAButton(String text, Container container) {
&&& JButton button = new JButton(text);
&&& button.setAlignmentX(Component.CENTER_ALIGNMENT);
&&& container.add(button);
private static void addButtons(Container container) {
&&& addAButton("Button 1", container);
&&& addAButton("Button 2", container);
&&& addAButton("Button 3", container);
&&& addAButton("Long-Named Button 4",
container);
&&& addAButton("5", container);
CardLayout
卡片布局和其他布局不同,因为它隐藏了一些组件。卡片布局就是一组容器或者组件,它们一次仅仅显是一个,组中的每个容器称为卡片。
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
src="../attachment/966555.jpg" alt="" border="0" />
内容面板代码:
public void addComponentToPane(Container pane) {
&&& final JPanel contentPanel = new JPanel();
&&& JPanel controlPanel = new JPanel();
&&& final CardLayout cardLayout=new CardLayout();;
&&& pane.setLayout(new BorderLayout());
&&& pane.add(contentPanel, BorderLayout.CENTER);
&&& pane.add(controlPanel, BorderLayout.PAGE_END);
&&& controlPanel.setLayout(new FlowLayout());
&&& JButton[] b = new JButton[10];
&&& for (int i = 0; i & 10; i++) {
&&&&&& b[i] = new JButton("No." + i);
&&&&&& contentPanel.add(b[i]);
&&& contentPanel.setLayout(cardLayout);
&&& JButton nextButton = new JButton("next");
&&& nextButton.addActionListener(new
ActionListener(){
&&&&&& public void actionPerformed(ActionEvent
&&&&&&&&&& cardLayout.next(contentPanel);
&&&&&& }});
&&& controlPanel.add(nextButton);
GridLayout
GridLayout让你建立一个组件表格,并且当组件加入时,会依序又左至右,由上至下填充到每个格子,它不能由你指定想放那个格子就放那个格子
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
src="../attachment/022250.jpg" alt="" border="0" />
内容面板代码:
public static void addComponentsToPane(Container pane) {
&&& JButton[] buttons = new JButton[9];
&&& pane.setLayout(new GridLayout(3, 3));
&&& for (int i = 0; i & buttons.length; i++) {
&&&&&& buttons[i] = new JButton(i + "");
&&&&&& pane.add(buttons[i]);
GridBagLayout
GridBagLayout是所有AWT布局管理器当中最复杂的,同时他的功能也是最强大的。GridBagLayout同GridLayout一样,在容器中以网格形式来管理组件。但GridBagLayout功能要来得强大得多。
1、GridBagLayout管理的所有行和列都可以是大小不同的;
2、GridLayout把每个组件限制到一个单元格,而GridBagLayout并不这样:组件在容器中可以占据任意大小的矩形区域。
GridBagLayout通常由一个专用类来对他布局行为进行约束,该类叫GridBagConstraints。其中有11个公有成员变量,GridBagConstraints可以从这11个方面来进行控制和操纵。这些内容是:
1、gridx―组件的横向坐标;
2、girdy―组件的纵向坐标;
3、gridwidth―组件的横向宽度,也就是指组件占用的列数;
4、gridheight―组件的纵向长度,也就是指组件占用的行数;
5、weightx―指行的权重,告诉布局管理器如何分配额外的水平空间;
6、weighty―指列的权重,告诉布局管理器如何分配额外的垂直空间;
7、anchor―当组件小于其显示区域时使用此字段;
8、fill―如果显示区域比组件的区域大的时候,可以用来控制组件的行为。控制组件是垂直填充,还是水平填充,或者两个方向一起填充;
9、insets―指组件与表格空间四周边缘的空白区域的大小;
10、ipadx―&组件间的横向间距,组件的宽度就是这个组件的最小宽度加上ipadx值;
11、ipady―&组件间的纵向间距,组件的高度就是这个组件的最小高度加上ipady值。
1、gridx,gridy:其实就是组件行列的设置,注意都是从0开始的,比如 gridx=0,gridy=1时放在0行1列;
2、gridwidth,gridheight:默认值为1;GridBagConstraints.REMAINDER常量,代表此组件为此行或此列的最后一个组件,会占据所有剩余的空间;
3、weightx,weighty:当窗口变大时,设置各组件跟着变大的比例。比如组件A的weightx=0.5,组件B的weightx=1,那么窗口X轴变大时剩余的空间就会以1:2的比例分配给组件A和B;
4、anchor:当组件空间大于组件本身时,要将组件置于何处。 有CENTER(默认值)、NORTH、NORTHEAST、EAST、SOUTHEAST、WEST、NORTHWEST选择。
5、insets:设置组件之间彼此的间距。它有四个参数,分别是上,左,下,右,默认为(0,0,0,0)。
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
src="../attachment/037170.jpg" alt="" border="0" />
内容面板代码:
public static void addComponentsToPane(Container pane) {
&&& pane.setLayout(new GridBagLayout());
&&& GridBagConstraints c = new GridBagConstraints();
&&& button = new JButton("Button 1");
&&& c.fill = GridBagConstraints.HORIZONTAL;
&&& c.gridx = 0;
&&& c.gridy = 0;
&&& pane.add(button, c);
&&& button = new JButton("Button 2");
&&& c.fill = GridBagConstraints.HORIZONTAL;
&&& c.weightx = 0.5;
&&& c.gridx = 1;
&&& c.gridy = 0;
&&& pane.add(button, c);
&&& button = new JButton("Button 3");
&&& c.fill = GridBagConstraints.HORIZONTAL;
&&& c.weightx = 0.5;
&&& c.gridx = 2;
&&& c.gridy = 0;
&&& pane.add(button, c);
&&& button = new JButton("Long-Named Button 4");
&&& c.fill = GridBagConstraints.HORIZONTAL;
&&& c.ipady = 40; // make this component tall
&&& c.weightx = 0.0;
&&& c.gridwidth = 3;
&&& c.gridx = 0;
&&& c.gridy = 1;
&&& pane.add(button, c);
&&& button = new JButton("5");
&&& c.fill = GridBagConstraints.HORIZONTAL;
&&& c.ipady = 0; // reset to default
&&& c.weighty = 1.0; // request any extra vertical space
&&& c.anchor = GridBagConstraints.PAGE_END; // bottom of space
&&& c.insets = new Insets(10, 0, 0, 0); // top padding
&&& c.gridx = 1; // aligned with button 2
&&& c.gridwidth = 2; // 2 columns wide
&&& c.gridy = 2; // third row
&&& pane.add(button, c);
一个GardBagLayout布局的左右选择框,代码GridBagLayoutFrame.java见附件,效果:
650) this.width=650;" onclick='window.open("/viewpic.php?refimg=" + this.src)'
src="../attachment/050504.jpg" alt="" border="0" />本文出自 “” 博客,请务必保留此出处
了这篇文章
附件下载:    
类别:┆阅读(0)┆评论(0)
22:58:28 11:52:20 09:11:50 14:38:10 08:46:02 10:55:54 15:25:00 18:21:24 17:30:04 14:47:31 &&1&
&&页数 ( 1/2 ) &
请输入验证码:您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
GridBagLayout(网格布局管理器)结构分析与功能使用详解.doc 20页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:150 &&
你可能关注的文档:
··········
··········
java.awt 类 GridBagLayout
java.lang.Object
java.awt.GridBagLayout
所有已实现的接口:
LayoutManager, LayoutManager2, Serializable
public class GridBagLayout
extends Object
implements LayoutManager2, Serializable
GridBagLayout 类是一个灵活的布局管理器,它不要求组件的大小相同便可以将组件垂直、水平或沿它们的基线对齐。每个 GridBagLayout 对象维持一个动态的矩形单元网格,每个组件占用一个或多个这样的单元,该单元被称为显示区域。
每个由 GridBagLayout 管理的组件都与 GridBagConstraints 的实例相关联。Constraints 对象指定组件的显示区域在网格中的具体放置位置,以及组件在其显示区域中的放置方式。除了 Constraints 对象之外,GridBagLayout 还考虑每个组件的最小大小和首选大小,以确定组件的大小。
网格的总体方向取决于容器的 ComponentOrientation 属性。对于水平的从左到右的方向,网格坐标 (0,0) 位于容器的左上角,其中 X 向右递增,Y 向下递增。对于水平的从右到左的方向,网格坐标 (0,0) 位于容器的右上角,其中 X 向左递增,Y 向下递增。
为了有效使用网格包布局,必须自定义与组件关联的一个或多个 GridBagConstraints 对象。可以通过设置一个或多个实例变量来自定义 GridBagConstraints 对象:
绝对值 相对于方向的值 相对于基线的值
·GridBagConstraints.NORTH
GridBagConstraints.SOUTH
GridBagConstraints.WEST
GridBagConstraints.EAST
GridBagConstraints.NORTHWEST
GridBagConstraints.NORTHEAST
GridBagConstraints.SOUTHWEST
GridBagConstraints.SOUTHEAST
GridBagConstraints.CENTER(默认值)
·GridBagConstraints.PAGE_START
GridBagConstraints.PAGE_END
GridBagConstraints.LINE_START
GridBagConstraints.LINE_END
GridBagConstraints.FIRST_LINE_START
GridBagConstraints.FIRST_LINE_END
GridBagConstraints.LAST_LINE_START
GridBagConstraints.LAST_LINE_END
GridBagConstraints.BASELINE
GridBagConstraints.BASELINE_LEADING
GridBagConstraints.BASELINE_TRAILING
GridBagConstraints.ABOVE_BASELINE
GridBagConstraints.ABOVE_BASELINE_LEADING
GridBagConstraints.ABOVE_BASELINE_TRAILING
GridBagConstraints.BELOW_BASELINE
GridBagConstraints.BELOW_BASELINE_LEADING
GridBagConstraints.BELOW_BASELINE_TRAILING
GridBagConstraints.weightx、GridBagConstraints.weighty
用于确定分布空间的方式,这对于指定调整行为至关重要。除非在行 (weightx) 和列 (weighty) 中至少指定一个组件的权重,否则所有组件都会聚集在其容器的中央。这是因为,当权重为零(默认值)时,GridBagLayout 对象会将所有额外空间置于其单元网格和容器边缘之间。
每行可以有一条基线,具体取决于该行中具有有效基线并沿此基线对齐的组件(组件的锚值是 BASELINE、BASELINE_LEADING 或 BASELINE_TRAILING 其中之一)。如果行中没有具有有效基线的组件,
正在加载中,请稍后...
191页78页99页190页84页106页89页155页155页67页JAVA中的一个布局管理器——GridBagLayout - CSDN博客
JAVA中的一个布局管理器——GridBagLayout
学JAVA已经有三个多月了,真是酸甜苦辣,自己体会。前几天时间碰到了一个问题,花了老长时间才弄明白(帮助文档看不懂,可能是因为自己比较笨的缘故);它,就是我们可爱的布局管理器GridBagLayout;今天又玩了一天,剩下点时间就整理整理这让我郁闷好几天的GridBagLayout吧,也许能帮上和我一样正在JAVA中苦苦挣扎的兄弟姐妹一点点小忙;先申明一下,这片文章是给和我一样傻的孩子看的,正常人就不要停在这里浪费时间了。
&&& 那我们现在就开始了。
&&& GridBagLayout布局管理器是一个非常灵活的布局,一看名字大家都知道它是基于GridLayout基础之上的,单位自然就按网格算了,它允许部件占有一个或者多个显示单元,也就是网格。它所管理的行和列可以是大小都不相同的,GridLayout把每个组件限制到一个单元格,而GridBagLayout并不这样,它的组件在容器中可以占据任意大小的矩形区域。
&&& GridBagLayout中有一个类叫作GridBagConstraints,这个类中的所有成员都是public的,GridBagLayout就是利用它来管理组件。
&&& 下面是GridBagConstraints中的公有成员变量&&&& public int anchor&&&&&&&& 对齐方式。&&&& public int fill&&&&&&&&&& 描述当容器变形时,控制组件是否增长。&&&& public gridheight&&&&&&&& 描述了组件所占网格的个数,gridheight描述在纵向上所占网格的个数&&&& Public gridweight&&&&&&&& 描述在横向上所占网格的个数。&&&& public girdx&&&&&&&&&&&&& 描述组件在布局时应处于那个网格位置,即描述网格x轴开始的位置。&&&& public gridy&&&&&&&&&&&&& 同样是网格开始的位置,gridy为y轴上开始的位置。&&&& public Insets insets&&&&& 用来调整它周围的空间大小。&&&& public int ipadx&&&&&&&&& 组件最小尺寸的约束条件。&&&& public int ipady&&&&&&&&& 组件最小尺寸的约束条件。&&&& public double weightx&&&& 描述当容器变形时,单元格本身在x轴上(横向上)如何缩放。&&&& public double weighty&&&& 描述当容器变形时,单元格本身在y轴上(纵向上)如何缩放。&&&& &&&& 很多是不是,呵呵,不多它怎么强大?下面我们来看一个实例:
&&&& 每次我们开始用GridBagLayout布局时最好画一张草图,如果偷懒或者已经达到一定境界,那么在你的头脑中一定要有一张完成的效果图,为了方便大家理解,下面是我画的一个效果图:(pic1)
&&&& (pic1)
&&&&&&&&& 效果图也看了,我想大家也应该知道我想做什么了,哦科,现在给代码;
import&java.awt.*;import&javax.swing.*;public&class&TT&extends&JPanel...{&&&&public&TT()&...{&&&&this.setLayout(new&GridBagLayout());&&//用匿名类创建GridBagLayout对象&&GridBagConstraints&c&=&new&GridBagConstraints();&&&&&&&&&&&&&&&&//constraints对象用来管理组件,指定组件的位置,占几个网格,是否可伸缩等&&JLabel&lab1&=&new&JLabel(&User&Name:&);&//实例化一个标签&&c.gridx&=&<span style="COLOR: #;&&&&c.gridy&=&<span style="COLOR: #;&//从草稿中我们可以看到标签lab1是从位于x,y轴都等于0的位置开始的&&c.gridwidth&=&<span style="COLOR: #;&&//标签lab1横向上所占网格的个数&&c.gridheight&=&<span style="COLOR: #;&//标签lab1纵向上所占网格的个数&&this.add(lab1,c);&//将标签lab1添加到JPanel上&&&&JTextField&tF1&=&new&JTextField(<span style="COLOR: #);&&c.gridx&=&<span style="COLOR: #;&&c.gridy&=&<span style="COLOR: #;&&c.gridwidth&=&<span style="COLOR: #;&&c.gridheight&=&<span style="COLOR: #;&&this.add(tF1,c);&&&&JLabel&lab2&=&new&JLabel(&Password:&);&&c.gridx&=&<span style="COLOR: #;&&c.gridy&=&<span style="COLOR: #;&&c.gridwidth&=&<span style="COLOR: #;&&c.gridheight&=&<span style="COLOR: #;&&this.add(lab2,c);&&&&JPasswordField&psw&=&new&JPasswordField(<span style="COLOR: #);&&c.gridx&=&<span style="COLOR: #;&&c.gridy&=&<span style="COLOR: #;&&c.gridwidth&=&<span style="COLOR: #;&&c.gridheight&=&<span style="COLOR: #;&&this.add(psw,c);&&&&JTextField&tF2&=&new&JTextField(&Ted's&GridBagLayout&Test&,<span style="COLOR: #);&&tF2.setEditable(false);&//设置JTextField是否可编辑,false为不可编辑&&c.gridx&=&<span style="COLOR: #;&&c.gridy&=&<span style="COLOR: #;&&c.gridwidth&=&<span style="COLOR: #;&&c.gridheight&=&<span style="COLOR: #;&&this.add(tF2,c);&&&&JTextArea&tA&=&new&JTextArea(<span style="COLOR: #,<span style="COLOR: #);&&c.gridx&=&<span style="COLOR: #;&&c.gridy&=&<span style="COLOR: #;&&c.gridwidth&=&<span style="COLOR: #;&&c.gridheight&=&<span style="COLOR: #;&&this.add(tA,c);&&&&&&&&&&&&}&public&static&void&main&(String&args[])&...{&&JFrame&JF&=&new&JFrame(&GridBagLayout&GUI&);&&&&&&&&&&&&&&&&JPanel&p&=&new&TT();&&&&&&&&&&&&&&&&JF.getContentPane().add(p);&&&&&&&&&&&&&&&&JF.pack();&&&&&&&&&&&&&&&&JF.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);&&&&&&&&&&&&&&&&JF.setSize(<span style="COLOR: #5,<span style="COLOR: #0);&&&&&&&&&&&&&&&&JF.setVisible(true);&}}
&&& 编译完成后执行,最终效果:(pic2)
&&& (pic2)
&&& 呵呵,跟我们的草稿一样吧。是不是看的还是有点不爽,眼睛,鼻子,眉毛都挤一块了?嘿嘿,再加一句:
&&& c.insets = new Insets (4,4,4,4);&&//new Insets(int top,int left,int bottom,int right)
&&& 我这里设的都是4个像素。
&&& 再看下最终结果:(pic3)
&&& (pic3)
&&& 是不是爽了?呵呵,我看了也很爽!
&&& 好了,就说这么多吧,其他的属性相信大家再看jdk doc应该没有什么问题了,自己慢慢研究吧,如果谁愿意分享一下自己的成果,就跟一下帖,完善一下,在下感激不尽.
&&& 最后,指正,批评!&
本文已收录于以下专栏:
相关文章推荐
原文转载:/taoweiji/archive//2818787.html
GridBagLayout是java里面最重...
GridBagLayout是java里面最重要的布局管理器之一,可以做出很复杂的布局,可以说GridBagLayout是必须要学好的的,
GridBagLayout 类是一个灵活的布局管理器...
关于java中gridbaglayout布局管理器的用法。
最近要写一个界面,我却发现一般的布局管理器都不那么好用。上网百度了一下,有人推荐gridbaglayout,却有很多人说gridbagla...
GridBagLayout是java里面最重要的布局管理器之一,可以做出很复杂的布局,可以说GridBagLayout是必须要学好的的,
GridBagLayout&#160;类是一个灵活的布局管理器,它...
1.通过下面的例子,我们可以看到,网格布局面板中添加分割线的方法是:
GridBagConstraints grid4 = new GridBagConstraints();
grid4.gr...
package com.exp5;
import java.awt.*;
public class demo3 extends Frame
private GridBagLayout gri...
使用Swing进行Java的GUI编程,其中一个难点就是页面布局。弄好了页面布局,就像是跨越了一个初级的里程碑。我主要是从事B/S的系统开发,基于新的应用需要,现在才来补一回Swing,一些简...
最近要写一个界面,我却发现一般的布局管理器都不那么好用。上网百度了一下,有人推荐GridBagLayout,却有很多人说GridBagLayout不好用,看不懂。
&#160;&#160;&#160; 于是我仔细查了一下java...
GridBagLayout是java里面最重要的布局管理器之一,可以做出很复杂的布局,可以说GridBagLayout是必须要学好的的,
GridBagLayout&#160;类是一个灵活的布局管理器,它...
GridBagLayout布局管理器是功能最强大,也是最复杂的布局管理器。与GridLayout管理器相比其特点是,一个组件可以跨越多个网格,而且各个组件的大小可以分别设置。
使用GridBagLa...
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)中国领先的IT技术网站
51CTO旗下网站
AWT的几种布局管理器
AWT中常用的布局管理器有如下几个:FlowLayout, BorderLayout, GridLayout, GridBagLayout, CardLayout,Swing还提供了一个BoxLayout。本文将详细介绍AWT的几种布局管理器。
作者:yuzhen99来源:yuzhen99的博客| 10:49
AWT中常用的布局管理器有如下几个:FlowLayout, BorderLayout, GridLayout, GridBagLayout, CardLayout,Swing还提供了一个BoxLayout。
FlowLayout从左向右排列所有组件,遇到边界就会折回下一行从新开始。它有三个构造器FlowLayout(),FlowLayout(int align)和 FlowLayout(int align, int hgap, int vgap),其中的hgap和vgap代表水平间距和垂直间距,align指的是组件的排列方向(从左向右,从右向左,从中间向两边),我们可以使用FlowLayout的静态常量来设置这个参数:FlowLayout.LEFT,FlowLayout.CENTER,FlowLayout.RIGHT。
BorderLayout将容器分为EAST,SOUTH,WEST,NORTH,CENTER五个区域,如下图所示:
我们在向使用此布局管理器的容器中添加组件时,需要制定添加到的区域,否则就默认添加到中间区域里,而当我们向一个区域添加多个组件时,后放入的组件会覆盖前面的组件。BorderLayout有两个构造器,BorderLayout()和BorderLayout(int hgap,int vgap),hgap和vgap代表的水平间距和垂直间距。我们在指定组件添加到的区域时,可以使用它的静态常量:BorderLayout.EAST, BorderLayout.WEST, BorderLayout.NORTH, BorderLayout.SOUTH, BorderLayout.CENTER。例如:
Frame&f&=&new&Frame(); &f.setLayout(new&BorderLayout(5,5)); &f.add(new&Button(&南&),SOUTH);&
BorderLayout最多只能放5个组件,但是实际上我们可以先在Panel中添加多个组件,再将Panel添加到BorderLayout布局管理器中,因此我们实际可以放的组件要远远超过5个。
GridLayout将容器分割成大小相同的网格,我们在添加组件时将默认从左到右从上到下,将组件依次添加到每个网格中,而每个组件的大小也就由其所添加到的网格的大小所决定。GridLayout同样也有两个构造器,GridLayout(int rows,int cols)和GridLayout(int rows ,int cols,int hgap,int vgap),使用GridLayout的典型例子就是计算器的窗口:
import&java.awt.*; &public&class&calculator &{ &&&&&public&static&void&main(String[]&args) &&&&&{ &&&&&&&&&Frame&f&=&new&Frame(&计算器&); &&&&&&&&&Panel&p1&=&new&Panel(); &&&&&&&&&p1.add(new&TextField(30)); &&&&&&&&&f.add(p1,BorderLayout.NORTH); &&&&&&&&& &&&&&&&&&&&&&&&&&&Panel&p2&=&new&Panel(); &&&&&&&&&p2.setLayout(new&GridLayout(3,5,4,4)); &&&&&&&&&String[]&name&=&{&0&,&1&,&2&,&3&,&4&,&5&,&6&,&7&,&8&,&9&,&+&,&-&,&*&,&/&,&.&}; &&&&&&&&&for(int&i=0;i&name.i++) &&&&&&&&&{ &&&&&&&&&&&&&p2.add(new&Button(name[i])); &&&&&&&&&} &&&&&&&&&f.add(p2);&&&&&&&&&f.pack();&&&&&&&&&f.setVisible(true); &&&&&} &}&
运行结果如图:
CardLayout将加入容器的所有组件看成一叠卡片,每次只有最上面的那个Component才可见,它有两个构造器CardLayout()和CardLayout(int hgap, int vgap),有五个方法用来控制其中的组件:
first(Container&target);&&last(Container&target); &&previous(Container&target); &&next(Container&target); &&show(Container&target,String&name);&
import&java.awt.*; &import&java.awt.event.ActionE &import&java.awt.event.ActionL &public&class&calculator &{ &&&&&Frame&f; &&&&&Panel&p1; &&&&&Panel&p2; &&&&&String[]&name&=&{&1&,&2&,&3&,&4&,&5&}; &&&&&CardLayout&c; &&&&& &&&&&public&void&init() &&&&&{&&&& &&&&&&&&&f&=&new&Frame(&yz&); &&&&&&&&&p1&=&new&Panel(); &&&&&&&&&p2&=&new&Panel(); &&&&&&&&&c&=&new&CardLayout(); &&&&&&&&& &&&&&&&&&p1.setLayout(c); &&&&&&&&&for(int&i=0;i&name.i++) &&&&&&&&&{ &&&&&&&&&&&&&p1.add(name[i],new&Button(name[i])); &&&&&&&&&} &&&&&&&&& &&&&&&&&&&&&&&&&&&Button&previous&=&new&Button(&上一张&); &&&&&&&&&previous.addActionListener(new&ActionListener() &&&&&&&&&{ &&&&&&&&&&&&&public&void&actionPerformed(ActionEvent&e) &&&&&&&&&&&&&{ &&&&&&&&&&&&&&&&&c.previous(p1); &&&&&&&&&&&&&} &&&&&&&&&}); &&&&&&&&&&&&&&&&&&Button&next&=&new&Button(&下一张&); &&&&&&&&&next.addActionListener(new&ActionListener() &&&&&&&&&{ &&&&&&&&&&&&&public&void&actionPerformed(ActionEvent&e) &&&&&&&&&&&&&{ &&&&&&&&&&&&&&&&&c.next(p1); &&&&&&&&&&&&&} &&&&&&&&&}); &&&&&&&&&&&&&&&&&&Button&first&=&new&Button(&第一张&); &&&&&&&&&first.addActionListener(new&ActionListener() &&&&&&&&&{ &&&&&&&&&&&&&public&void&actionPerformed(ActionEvent&e) &&&&&&&&&&&&&{ &&&&&&&&&&&&&&&&&c.first(p1); &&&&&&&&&&&&&} &&&&&&&&&}); &&&&&&&&&&&&&&&&&&Button&last&=&new&Button(&最后一张&); &&&&&&&&&last.addActionListener(new&ActionListener() &&&&&&&&&{ &&&&&&&&&&&&&public&void&actionPerformed(ActionEvent&e) &&&&&&&&&&&&&{ &&&&&&&&&&&&&&&&&c.last(p1); &&&&&&&&&&&&&} &&&&&&&&&}); &&&&&&&&&&&&&&&&&&Button&third&=&new&Button(&第三张&); &&&&&&&&&third.addActionListener(new&ActionListener() &&&&&&&&&{ &&&&&&&&&&&&&public&void&actionPerformed(ActionEvent&e) &&&&&&&&&&&&&{ &&&&&&&&&&&&&&&&&c.show(p1,&3&); &&&&&&&&&&&&&} &&&&&&&&&}); &&&&&&&&&p2.add(previous); &&&&&&&&&p2.add(next); &&&&&&&&&p2.add(first); &&&&&&&&&p2.add(last); &&&&&&&&&p2.add(third); &&&&&&&&&f.add(p1);&&&&&&&&&f.add(p2,BorderLayout.SOUTH); &&&&&&&&&f.pack(); &&&&&&&&&f.setVisible(true); &&&&&} &&&&&public&static&void&main(String[]&args) &&&&&{ &&&&&&&&&new&calculator().init(); &&&&&} &}&
GridBagLayout是功能最强大也是最复杂的布局管理器,添加到其中的组件可以横跨一个或多个网格,并可以设置各网格的大小各不相同,当窗口大小发生变化时,其也可以准确的控制窗口各部分的反应。为了处理GridBagLayout中组件的大小和跨越性,我们还需要一个GridBagConstraints对象,用这个对象与特定的组件相关联,来控制组件的大小和跨越性。在使用GridBagLayout时一般需要4步:
1. 创建GridBagLayout,并指定容器使用该布局管理器
GridBagLayout&gb&=&new&GridBagLayout(); &container.setLayout(gb);&
2. 创建GridBagConstraints的对象,并设置该对象的相关属性
GridBagConstraints&gbc&=&new&GridBagConstraints(); &gbc.gridx=2; &gbc.gridy=1; &gbc.gridwidth=2; &gbc.gridheight=1;&
3. 调用GridBagLayout对象的方法来建立GridBagConstraints对象与受控制组件之间的联系。
gb.setConstraints(c,gbc);&
4. 添加组件
container.add(c);&
通常我们可以将2,3,4步写成一个addComponent方法,为这个方法传递所需要的参数,来进行添加组件的化简。例如:
public&void&addComponent(Component&c,&int&gx,&int&gy,&int&gw,int&gh) &{ &&&&&this.gridx= &&&&&this.gridy= &&&&&this.gridwidth= &&&&&this.gridheight= &&&&&gb.setConstraints(c,gbc); &&&&&container.add(c); &}&
使用GridBagLayout关键在于GridBagConstraints,该类具有如下几个方法:
fill:设置组件如何占领空白区域,它可取如下几个值:GridBagConstraints.NONE, GridBagConstraints.HORIZONTAL, GridBagConstraints.VERTICAL, GridBagConstraints.BOTH。
gridx,gridy:设置组件的左上角所在网格的索引(网格的索引从0 开始),此外这两个值还可以设为GridBagConstraints.RELATIVE,这个值也是默认值,它表明当前组件紧跟在上一个组件之后。
gridwidht和gridheight:设置组件横向纵向跨越多少个网格,他们的默认值都是1,如果该组件是横向或纵向的最后一个还可以将此值设为GridBagConstraints.REMAINDER,若为倒数第二个组件则可以设值为GridBagConstraints.RELATIVE。
ipadx和ipady:设置组件横向纵向的内部填充大小,即在组件的最小尺寸上还需要增大多少,若设置了这个值则组件在最小尺寸的基础上增大ipadx*2或 ipady*2像素。
weightx和weighty(double类型):就是权重,也就是组件组件占领多余空间的水平或垂直增加比例,默认值为0也就是不占领多余空间。例如有三个组件,我们将他们的水平增加比例分别设为1.0,2.0,3.0,当容器宽度增加60像素时,他们分别增加10,20和30像素。如果我们希望某个组件的大小会随着容器的变化而变化,我们需要同时设置fill和weightx,weighty属性。
Swing中的BoxLayout布局管理器提供了一个构造器:BoxLayout(Container targer,int axis),它制定创建基于targer容器的BoxLayout布局管理器,它里面的组件按axis方向排列,axis有BoxLayout.X_AXIS和BoxLayout.Y_AXIS两个方向。BoxLayout通常和Box容器结合使用,Box容器有点像Panel,它默认使用BoxLayout布局管理器。Box有两个静态方法来创建Box对象:createHorizontalBox()和createVerticalBox(),一旦获得了Box容器之后,就可以使用Box来承装普通GUI组件,然后再将这些Box组件添加到其他容器中,从而形成整体的窗口布局。例如:
public&class&Test &{ &&&&&private&Frame&f&=&new&Frame(&cs&); &&&&&private&Box&horizontal&=&Box.createHorizontalBox(); &&&&&private&Box&vertical&=&Box.createVerticalBox(); &&&&&public&void&init() &&&&&{ &&&&&&&&&horizontal.add(new&Button(&shuiping1&)); &&&&&&&&&horizontal.add(new&Button(&shuiping2&)); &&&&&&&&&vertical.add(new&Button(&chuizhi1&)); &&&&&&&&&vertical.add(new&Button(&chuizhi2&)); &&&&&&&&&f.add(horizontal,&BorderLayout.NORTH); &&&&&&&&&f.add(vertical); &&&&&&&&&f.pack(); &&&&&&&&&f.setVisible(true); &&&&&} &&&&&public&static&void&main(String[]&args) &&&&&{ &&&&&&&&&new&Test().init(); &&&&&} &}&
最后我们还可以使用绝对定位:只需要将Container的布局管理器设为null即可,也就是setLayout(null),往容器中加组件的时候指定组件的位置和大小。一般调用setBounds(int x,int y,int width,int height)。
原文链接:
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
头条头条热点头条原创
24H热文一周话题本月最赞
讲师:207903人学习过
讲师:305354人学习过
讲师:153613人学习过
精选博文论坛热帖下载排行
本书是按照全国计算机技术与软件专业技术资格(水平)考试《网络管理员考试大纲》的要求,参照《网络管理员教程》及近年来考试试题编写的。...
订阅51CTO邮刊

我要回帖

更多关于 java 网格布局管理器 的文章

 

随机推荐