Java图形程序设计(五)——布局管理

在讨论每个 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);
       }
}

运行结果截图:

这里写图片描述

实际上这样整齐的布局极少。在大多数情况下,只有一行或一列的网格布局比较有用。


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值