前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >布局管理器

布局管理器

作者头像
mathor
发布2018-08-03 17:34:51
1.1K0
发布2018-08-03 17:34:51
举报
文章被收录于专栏:mathormathor
  • Java语言中,提供了布局管理器类的对象
    • 管理Component在Container中的布局,不必直接设置Component位置和大小
    • 每个Container都有一个布局管理器对象,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器,调用Container的setLayout方法改变其布局管理器对象
  • AWT提供了5种布局管理器类:
    • FlowLayout
    • BorderLayout
    • GridLayout
    • CardLayout
    • GridBagLayout

 针对我们之前留下的作业来说,当缩放外层Frame窗口的大小时,内层Panel并不会随之改变大小,所以我们需要一个事件监听,让他能够随之改变,但是这样太麻烦了,于是Java给我们提供了一个布局管理器类,这个布局管理器举个例子相当于一个大管家,房子相当于Frame,其中的家具就相当于Frame里的元素,我们只管把元素往Frame里丢,不用管怎么排列,大管家自动帮我们排列。不同的布局管理器有不同的风格

FlowLayout布局管理器
  • FlowLayout是Panel类的默认布局管理器
    • FlowLayout布局管理器对组件逐行定位,行内从左到右,一行排满后换行
    • 不改变组件大小,按组件原有尺寸显示组件,可设置间距,行距以及默认对齐方式(默认是居中)
  • FlowLayout的构造方法
    • FlowLayout(FlowLayout.RIGHT,20,40):右对齐,组件间水平间距20,垂直间距40
    • FlowLayout(FlowLayout.LEFT):左对齐,水平和垂直间距为缺省值(5)
    • FlowLayout():使用缺省的居中对齐方式,水平和垂直间距为缺省值(5)
代码语言:javascript
复制
import java.awt.*;
public class TestFlowLayout {
    public static void main(String[] args) {
        Frame f = new Frame("Flow Layout");
        Button b1 = new Button("Ok");
        Button b2 = new Button("Open");
        Button b3 = new Button("Close");
        f.setLayout(new FlowLayout());
        f.add(b1);
        f.add(b2);
        f.add(b3);
        f.setSize(400,400);
        f.setBackground(Color.red);
        f.setVisible(true);
    }
}
image
image
BorderLayout布局管理器
  • BorderLayout是Frame类的默认布局管理器
  • BorderLayout将整个容器的布局划分成
    • 东(EAST)
    • 西(WEST)
    • 南(SOUTH)
    • 北(NORTH)
    • 中(CENTER)五个区域,组件只能添加到指定的区域
  • 如不制定组件的假如部位,则默认加入到Center区
  • 每个区域只能加入一个组件,如加入多个,则先前加入的会被覆盖(可以加入一个Panel,然后往Panel里加入组件)
  • BoderLayout型布局管理器尺寸缩放原则
    • 北、南两个区域在水平方向缩放
    • 东、西两个区域在垂直方向缩放
    • 中部在两个方向都缩放
代码语言:javascript
复制
import java.awt.*;
public class TestBorderLayout {
    public static void main(String[] args) {
        Frame f;
        f = new Frame("Test BorderLayout");
        Button bn = new Button("bn");
        Button bs = new Button("bs");
        Button bw = new Button("bw");
        Button be = new Button("be");
        Button bc = new Button("bc");
        /*
        f.add(bn,"north");
        f.add(bs,"south");
        f.add(bw,"west");
        f.add(be,"east");
        f.add(bc,"center");
        */
        f.add(bn,BorderLayout.NORTH);
        f.add(bs,BorderLayout.SOUTH);
        f.add(bw,BorderLayout.WEST);
        f.add(be,BorderLayout.EAST);
        f.add(bc,BorderLayout.CENTER);
        f.setSize(500,500);
        f.setVisible(true);
    }
}

 不建议用注释内的方法,因为一旦写错,编译不会报错,运行时会报错

image
image
GridLayout布局管理器
  • GridLayout型布局管理器将空间划分成规则的矩形网格,每个单元格区域大小相等。组件被添加到每个单元格中,先从左到右添满一行后换行,再从上到下
  • 在GridLayout构造方法中制定分割的行数和列数
    • 如:GridLayout(3,4)
代码语言:javascript
复制
import java.awt.*;
public class TestGridLayout {
    public static void main(String[] args) {
        Frame f = new Frame("Test GridLayout");
        for(int i = 1;i <= 6;i++) 
            f.add(new Button("B" + i));
        f.setLayout(new GridLayout(3,2));
        f.pack();
        f.setVisible(true);
    }
}

 pack方法是使得Frame窗口刚好包住其中的元素的大小

作业

 做出下图所示的窗口界面

代码语言:javascript
复制
import java.awt.*;
public class TenButtons {

    public static void main(String[] args) {
        Frame f = new Frame("Java Frame");
        f.setLayout(new GridLayout(2,1));
        f.setLocation(300,400);
        f.setSize(400,400);
        f.setBackground(Color.red);
        Panel p1 = new Panel(new BorderLayout());
        Panel p2 = new Panel(new BorderLayout());
        Panel p11 = new Panel(new GridLayout(2,1));
        Panel p22 = new Panel(new GridLayout(2,2));
        p1.add(new Button("Button"),BorderLayout.WEST);
        p1.add(new Button("Button"),BorderLayout.EAST);
        p11.add(new Button("Button"));
        p11.add(new Button("Button"));
        p1.add(p11,BorderLayout.CENTER);
        p2.add(new Button("Button"),BorderLayout.WEST);
        p2.add(new Button("Button"),BorderLayout.EAST);
        for(int i = 1;i <= 4;i++) 
            p22.add(new Button("Button"));
        p2.add(p22,BorderLayout.CENTER);
        f.add(p1);
        f.add(p2);
        f.setVisible(true);
    }

}
布局管理器总结
  • Frame是一个顶级窗口,Frame的缺省布局管理器为BorderLayout
  • Panel无法单独显示,必须添加到某个容器中
    • Panel的缺省布局管理器为FlowLayout
  • 当把Panel作为一个组件添加到某个容器中后,该Panel仍然可以有自己的布局管理器
  • 使用布局管理器时布局管理器负责各个组件的大小和位置,因此用户无法在这种情况下设置组件大小和位置属性,如果试图用Java语言提供的setLocation(),setSize()等方法,则都会被布局管理器覆盖
  • 如果用户确需要亲自设置组件大小或位置,则应取消该容器的布局管理器,方法为:
    • setLayout(null)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-07-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • FlowLayout布局管理器
  • BorderLayout布局管理器
  • GridLayout布局管理器
  • 作业
  • 布局管理器总结
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档