5.布局设计_布局包含设计吗-程序员宅基地

在界面设计中,一个容器要放置许多组件,为了美观,为组件安排在容器中的位置,这就是布局设计。java.awt中定义了多种布局类,每种布局类对应一种布局的策略。常用的有以下布局类:

  • FlowLayout,依次放置组件。
  • BoarderLayout,将组件放置在边界上。
  • CardLayout,将组件像扑克牌一样叠放,而每次只能显示其中一个组件。
  • GridLayout,将显示区域按行、列划分成一个个相等的格子,组件依次放入这些格子中。
  • GridBagLayout,将显示区域划分成许多矩形小单元,每个组件可占用一个或多个小单元。
其中GridBagLayout能进行精细的位置控制,也最复杂,本教程暂不讨论这种布局策略,将在专题文章中进行详细讲解。

每个容器都有一个布局管理器,由它来决定如何安排放入容器内的的组件。布局管理器是实现LayoutManager接口的类。

一.FlowLayout布局 (JApplet,JPanel,JScrollPane默认布局)

FlowLayout布局是将其中的组件按照加入的先后顺序从左到右排列,一行满之后就转到一下行继续从左到右排列,每一行中的组件都居中排列。这是一种最简便的布局策略,一般用于组件不多的情况,当组件较多时,容器中的组件就会显得高低不平,各行长短不一。

FlowLayout是小应用程序和面板默认布局,FlowLayout布局的构造方法有:
  1. FlowLayout(),生成一个默认的FlowLayout布局。默认情况下,组件居中,间隙为5个像素。
  2. FlowLayout(int aligment),设定每珩的组件的对齐方式。alignment取值可以为 FlowLayout.LEFT,FlowLayout.CENTER,FlowLayout.RIGHT。
  3. FlowLayout(int aligment,int horz, int vert),设定对齐方式,并设定组件的水平间距horz和垂直间距vert,用超类Container的方法setLayout()为容器设定布局。例如,代码setLayout(new FlowLayout())为容器设定 FlowLayout布局。将组件加入容器的方法是add(组件名)。

二.BorderLayout布局(JWindow、JFrame,JDialog的默认布局)

BorderLayout布局策略是把容器内的空间简单划分为东“East”,西 “West”,南 “South”,北 “North”,中 “Center”五个区域。 加入组件时,都应该指明把组件放在哪一个区域中。一个位置放一个组件。如果某个位置要加入多个组件,应先将要加入该位置的组件放放另一个容器中,然后再将这个容器加入到这个个位置。

BorderLayout布局的构造方法有:
(1) BorderLayout(),生成一个默认的BorderLayout布局。默认情况下,没有间隙。
(2) BorderLayout(int horz,int vert),设定组件之间的水平间距和垂直间距。

BorderLayout布局策略的设定方法是setLayout(new BorderLayout())。将组件加入到容器的方法是add(组件名,位置),如果加入组件时没有指定位置,则默认为“中”位置。

BorderLayout布局是JWindow、JFrame,JDialog的默认布局。
【例 11-5】应用程序设有五个标签、分别放于窗口的东、西、南、北和中五个区域( 查看源文件 )。

三.GridLayout布局

GridLayout布局是把容器划分成若干行和列的网格状,行数和列数由程序控制,组件放在网格的小格子中。 GridLayout布局的特点是组件定位比较精确。由于GridLayout布局中每个网格具有相同形状和大小,要求放入容器的组件也应保持相同的大小。

GridLayout布局的构造方法有:
(1) GridLayout(),生成一个单列的GridLayout布局。默认情况下,无间隙。
(2) GridLayout(int row,int col),设定一个有行row和列col的GridLayout布局。
(3) GridLayout(int row,int col,int horz,int vert),设定布局的行数和列数、组件的水平间距和垂直间距。

GridLayout布局以行为基准,当放置的组件个数超额时,自动增加列;反之,组件太少也会自动减少列,行数不变,组件按行优先顺序排列(根据组件自动增减列)。GridLayout布局的每个网格必须填入组件,如果希望某个网格为空白,可以用一个空白标签(add(new Label()))顶替。

【例 11-6】小应用程序先将若干个按钮和若干个标签放入JPanel中,然后将JPanel放入JScrollPane中,最后,将JScrollPane放入小程序的窗口中,程序所创建的JScrollPane总是带水平和垂直滚动条,滚动面板的可视范围小于面板的实际要求,可以移动滚动条的滑块显示面板原先不在可视范围内的区域( 查看源文件 )。

GridLayout布局要求所有组件的大小保持一致,这可能会使用界面外观不够美观。一个补救的办法是让一些小组件合并放在一个容器中,然后把这个容器作为组件,再放入到GridLayout布局中。这就是前面所说的容器嵌套。例如,容器A使用GridLayout布局,将容器均分为网格;另有容器B和C各放入若干组件后,把B和C分别作为组件添加到容器A中。容器B和C也可以设置为GridLayout布局,把自己分为若干网格,也可以设置成其他布局。这样,从外观来看,各组件的大小就有了差异。

四.CardLayout布局

采用CardLayout布局的容器虽可容纳多个组件,但是多个组件拥有同一个显示空间,某一时刻只能显示一个组件。就像一叠扑克牌每次只能显示最上面的一张一样,这个显示的组件将占据容器的全部空间。CardLayout布局设计步骤如下:
先创建CardLayout布局对象。然后,使用setLayout()方法为容器设置布局。最的,调用容器的add()方法将组件加入容器。CardLayout布局策略加入组件的方法是:
    add(组件代号,组件);
其中组件代号是字符串,是另给的,与组件名无关。

例如,以下代码为一个JPanel容器设定CardLayout布局:
    CardLayout myCard = new CardLayout();//创建CardLayout布局对象
    JPanel p = new JPanel();//创建Panel对象
    p.setLayout(myCard);

用CardLayout类提供的方法显示某一组件的方式有两种:
(1) 使用show(容器名,组件代号)形式的代码,指定某个容器中的某个组件显示。例如,以下代码指定容器p的组件代号k,显示这个组件:
    myCard.show(p,k);
(2) 按组件加入容器的顺序显示组件。
first(容器):例如,代码myCard.first(p);
last(容器):例如 , myCard.last(p);
next(容器):例如,myCard.next(p);
previous(容器):myCard.previous(p);

【例11-7】小应用程序使用CardLayout布局,面板容器p使用CardLayout布局策略设置10个标签组件。窗口设有4个按钮,分别负责显示p的第一个组件、最后一个组件、当前组件的前一个组件和当前的组件的最后一个组件( 查看源文件 )。

五.null布局与setBounds方法

空布局就是把一个容器的布局设置为null布局。 空布局采用setBounds()方法设置组件本身的大小和在容器中的位置:
    setBounds(int x,int y,int width,int height)
组件所占区域是一个矩形,参数x,y是组件的左上角在容器中的位置坐标;参数weight,height是组件的宽和高。空布局安置组件的办法分两个步骤:先使用add()方法身容器添加组件。然后调用setBounds()方法设置组件在容器中的位置和组件本身的大小。与组件相关的其他方法:
  1. getSize().width,
  2. getSize().height
  3. setVgap(ing vgap)
  4. setHgap(int hgap);
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013806647/article/details/38982367

智能推荐

爬取twitter数据--使用twint_twint使用方法-程序员宅基地

文章浏览阅读1.2w次,点赞3次,收藏56次。最近因为实验验证的需要,想要爬取推特的数据,首先想到的是通过推特官方的开发者计划拿到key然后直接爬取,连接如下:twitter myapp但是问题就在于,这玩意我用两个号申请都被拒绝了,据说是+86的号码被拒就是会很大。我……,想要申请试试的参考下面这个链接知乎问题,这个下面的评论多看看,注意一些话术,可能会成功。后来我找到了这个开源的东西,twint,可以直接爬取https://github.com/twintproject/twint安装方式就是官方的这个安装方式:git clone -_twint使用方法

好看的安全跳转单页html源码_好看的html跳转网页源码-程序员宅基地

文章浏览阅读4.6k次,点赞38次,收藏35次。好看的安全跳转单页html源码,效果如下代码如下:_好看的html跳转网页源码

人工智能与金融金融:数字货币的未来-程序员宅基地

文章浏览阅读785次,点赞15次,收藏14次。1.背景介绍随着全球金融市场的不断发展和变化,数字货币已经成为了金融领域的一个热门话题。数字货币是一种电子货币,它使用数字代币作为货币单位,并通过数字账户和数字钱包进行交易。随着人工智能(AI)技术的不断发展,数字货币的应用范围也在不断扩大。本文将讨论数字货币在未来金融领域的应用前景,以及人工智能技术在数字货币领域的作用。数字货币的主要特点是它们是去中心化的,不受任何政府或金融机构的控制。...

基于单片机智能台灯无线蓝牙APP控的设计与实现-程序员宅基地

文章浏览阅读903次,点赞27次,收藏28次。1. 背景介绍1.1 智能照明系统概述随着物联网技术的快速发展,智能照明系统已经成为家居自动化领域的一个重要组成部分。传统的照明系统通常由电源开关、电线和灯具组成,用户需要手动操作开关来控制照明。而智能照明系统则可以通过无线通信技术实现对灯具的远程控制,提高了照明系统的便利性和灵活性。

Python数据可视化 | 豆瓣电影Top250数据分析-程序员宅基地

文章浏览阅读2.1w次,点赞48次,收藏191次。本文通过python对已爬取并保存在Excel里的豆瓣电影Top250信息进行数据可视化分析。

html页面耗内存严重,页面优化-如何减少网页的内存与CPU占用-程序员宅基地

文章浏览阅读4.7k次。有的网页看起来并不大但打开会很卡,有的网页虽然很长但使用流畅,占用用户电脑的内存与CPU就影响这些。浏览器问题,有各自的浏览器处理内存问题会影响到,但几乎没办法控制得了,Windows上的:IE系列,刷新回收的量不大,但最小化会释放内存,。Firefox2据说也会在最小化回收,可我从没见过最垃圾,用多少是多少,基本不回收。据说prototype的ajax还会引起内存一直增加。Opera最好。一直控..._html资源占用过高

随便推点

双目相机的标定 python_六个步骤完成双目相机的标定,这么看来也不是很难嘛...-程序员宅基地

文章浏览阅读1.3k次。机器视觉之halcon入门(40)-双目相机的标定一个相机看到的是一张图像,只有二维信息,要想获取空间物体的三维信息,有一种常用的一种方法是:模拟人眼,用两个相机,就是所谓的双目相机。用相机总是少不了标定。单个相机的标定,就是获取相机的内参、外参(之前有一个章节详细说过)。双目的标定是默认已经知道两个相机的内参,只标定外参:即两个相机之间的姿态关系。以halcon例程binocular_calib..._双目相机外参标定

华为交换机简单DHCP配置_交换机上可以搞dhcp吗-程序员宅基地

文章浏览阅读1.5k次。华为交换机简单DHCP配置_交换机上可以搞dhcp吗

C++学习之双端队列depue_depuec++-程序员宅基地

文章浏览阅读1.9k次。6、双端队列deque所谓的deque是”double ended queue”的缩写,双端队列不论在尾部或头部插入元素,都十分迅速。而在中间插入元素则会比较费时,因为必须移动中间其他的元素。双端队列是一种随机访问的数据类型,提供了在序列两端快速插入和删除操作的功能,它可以在需要的时候改变自身大小,完成了标准的C++数据结构中队列的所有功能。Vector是单向开口的连续线性空间,deque则..._depuec++

多年大数据开发经验总结_大数据项目经历-程序员宅基地

文章浏览阅读5.5k次,点赞15次,收藏8次。多年工作经验总结初入行,搞大数据开发。得高人指点,先学mapreduce,不足一年,tez兴,后入此道。朝夕不倦,发愤图强,才能略知一二。无奈后浪推前浪,tez被spark拍在沙滩上,遂投spark之怀。继而抖擞精神,奋袂而起,github、stackoverflow轮番上阵,终七窍通六窍。然乾坤更替,岁月不复,spark转眼成过眼烟云,flink、 beam之流成业界新宠,一时洛阳纸贵,众人..._大数据项目经历

Python实现时间序列分析进行平稳性检验(ADF和KPSS)和差分去趋势(adfuller和kpss算法)项目实战_python adf检验-程序员宅基地

文章浏览阅读1.3k次,点赞18次,收藏20次。Python实现时间序列分析进行平稳性检验(ADF和KPSS)和差分去趋势(adfuller和kpss算法)项目实战_python adf检验

Intellij Idea 设置方法模板_idea if模板-程序员宅基地

文章浏览阅读2w次,点赞5次,收藏6次。设置Idea的方法注释模板 详细配置: /** * @author usernameusername datedate * @time timetime * @method methodmethod * @param paramparam * @return methodretur_idea if模板