JAVA布局管理器
JAVA的界面布局原理:由于Java是跨平台语言,使用绝对坐标显然会导致问题,即在不同平台、不同分辨率下的显示效果不一样。Java 为了实现跨平台的特性并且获得动态的布局效果,Java将容器内的全部组件安排给一个“布局管理器”负责管理,如:排列顺序,组件的大小,位置等,当窗体移动或调整大小后组件怎样变化等功能授权给相应的容器布局管理器来管理,不同的布局管理器使用不同算法和策略,容器可以通过选择不同的布局管理器来决定布局。 Java中一共同拥有6种布局管理器,通过使用6种布局管理器组合,可以设计出复杂的界面,并且在不同操作系统平台上都可以有一致的显示界面。6种布局管理器各自是BorderLayout、BoxLayout、FlowLayout、GirdBagLayout、GirdLayout和 CardLayout。当中CardLayout必须和其它5种配合使用,不是特别经常使用的。每种界面管理器各司其职,都有各自的作用。
CardLayout(卡式布局)
CardLayout布局管理器可以帮助用户处理两个以至很多其它的成员共享同一显示空间,它把容器分成很多层,每层的显示空间占领整个容器的大小,可是每层仅仅同意放置一个组件,当然每层都可以利用Panel来实现复杂的用户界面.布局管理器(CardLayout)就象一副叠得整整齐齐的扑克牌一样,有54张牌,可是你仅仅能看见最上面的一张牌,每一张牌就相当于布局管理器中的每一层.事实上现步骤例如以下:
首先,定义面板,为个个面板设置不同的布局,并依据须要在每一个面板中放置组件:
panelOne.setLayout(new FlowLayout);
panelTwo.setLayout(new GridLayout(2,1));
再设置主面板.
CardLayout card = new CardLayout();
panelMain.setLayout(card);
下一步将開始准备好的面板加入到主面板
panelMain.add("red panel",panelOne);
panelMain.add("blue panel",panelOne);
add()方法带有两个參数,第一个为String类型用来表示面板标题,第二个为Panel对象名称.
完毕以上步骤以后,必须给用户提供在卡片之间进行选择的方法.一个经常使用的方法是每张卡片都包括一个button.通经常使用来控制显示哪张面板.actionListener被加入到button..actionPerformed()方法可定义显示哪张卡片.:
card.next(panelMain); //下一个
card.previous(panelMain); //前一个
card.first(panelMain); //第一个
card.last(panelMain); //最后一个
card.show(panelMain,"red panel"); //特定面板
BorderLayout布局管理器:BorderLayout 也是一种很easy的布局策略,它把容器内的空间简单地划分为东、西、南、北、中无个区域,没加入一个组件都应该指明把这个组件加在哪个区域中。 BorderLayout是顶层容器( JFrame, JDialog, 和 JApplet )的默认布局管理器。有五个位置组件:
这个界面最多仅仅能显示5个控件。加入控件的时候,可以指定加入的方位,默认的情况是加入到中间。在BorderLayout中整理尺寸是,四周的控件会被调整,调整会依照布局管理器的内部规则计算出应该占多少位置,然后中间的组件会占去剩下的空间。
BorderLayout 是Window,Frame和Dialog的缺省布局管理器. BorderLayout布局管理器把容器分成5个区域:North,South,East,West和Center,每一个区域仅仅能放置一个组件.在使用 BorderLayout的时候,假设容器的大小发生变化,其变化规律为:组件的相对位置不变,大小发生变化.比如容器变高了,则North、South 区域不变,West、Center、East区域变高;假设容器变宽了,West、East区域不变,North、Center、South区域变宽.不一定全部的区域都有组件,假设四周的区域(West、East、North、South区域)没有组件,则由Center区域去补充,可是假设 Center区域没有组件,则保持空白.
演示样例:
import java.awt.*;
public class buttonDir{
public static void main(String args[]){
Frame f = new Frame("BorderLayout");
f.setLayout(new BorderLayout());
f.add("North", new Button("North");
//第一个參数表示把button加入到容器的North区域
f.add("South", new Button("South");
//第一个參数表示把button加入到容器的South区域
f.add("East", new Button("East");
//第一个參数表示把button加入到容器的East区域
f.add("West", new Button("West");
//第一个參数表示把button加入到容器的West区域
f.add("Center", new Button("Center");
//第一个參数表示把button加入到容器的Center区域
f.setSize(200,200);
f.setVisible(true);
}
}
FlowLayout布局管理器:流式布局管理器把容器看成一个行集,好象平时在一张纸上写字一样,一行写满就换下一行。行高是用一行中的控件高度决定的。FlowLayout是全部 JApplet/JApplet的默认布局。在生成流式布局时可以指定显示的对齐方式,默认情况下是居中(FlowLayout.CENTER)。在以下的演示样例中,可以用例如以下语句指定居左
JPanel panel= new JPanel(new FlowLayout(FlowLayout.LEFT)));
此为小应用程序(Applet)和面板(Panel)的缺省布局管理器,组件从左上角開始,按从左至右的方式排列.其构造函数为:
FlowLayout() //生成一个默认的流式布局,组件在容器里居中,每一个组件之间留下5个像素的距离.
FlowLayout(int alinment) //可以设定每行组件的对齐方式.
FlowLayout(int alignment,int horz,int vert) //设定对齐方式并设定组件水平和垂直的距离.
当容器的大小发生变化时,用FlowLayout管理的组件会发生变化,其变化规律是:组件的大小不变,可是相对位置会发生变化.
GirdLayout布局管理器:GridLayout 将成员按网格型排列,每一个成员尽可能地占领网格的空间,每一个网格也相同尽可能地占领空间,从而各个成员按一定的大小比例放置。假设你改变大小, GridLayout将相应地改变每一个网格的大小,以使各个网格尽可能地大,占领Container容器全部的空间。
基本布局策略是把容器的空间划分成若干行乘若干列的网格区域,组件就位于这些划分出来的小区域中,全部的区域大小一样。组件按从左到右,从上到下的方法加入。
用构造函数划分出网格的行数和列数,
new GridLayout(行数,列数);
构造函数里的行数和列数可以有一个为零,可是不能都为零。当容器里添加控件时候,容器内将向0的那个方向增长。比如,假设是例如以下语句:
GridLayout layout= new GridLayout(0,1);
在添加控件时,会保持一个列的情况下,不断把行数增长。
java.awt.GridBagConstraints 中的insets(0,0,0,0)的參数详细指的是:
规定一个控件显示区的空白区。假设控件显示的inset为(10,5,20,0)
那么控件到显示区北边距离为10,西边为5,南边为20,东边为0控件会比显示区小。假设inset为负,控件会超出显示区
使容器中各个组件呈网格状布局,平均占领容器的空间.当全部组件大小同样时,使用此布局.其构造函数为:
GridLayout()
GridLayout(int row,int col)
GridLayout(int row,int col,int horz,int vert)
BoxLayout布局管理器: BoxLayout布局可以同意将控件依照X轴(从左到右)或者Y轴(从上到下)方向来摆放,并且沿着主轴可以设置不同尺寸。
构造BoxLayout对象时,有两个參数,比如:
Public BoxLayout(Container target,int axis);
Targe參数是表示当前管理的容器,axis是指哪个轴,有两个值??BoxLayout.X_AXIS和BoxLayout.Y_AXIS。
看例如以下的代码:
JPanel jpanel=new JPanel();
Jpanel.setLayout(new BoxLayout(jpanel,BoxLayout.Y_AXIS);
TextArea testArea=new TextArea(4,20);
JButton button=new JButton(“this is a button”);
jpanel.add(testArea);
jpanel.add(button);
//容纳testArea和button的容器,对他们沿Y轴(从上往下)放置,而且文本域和按纽左对齐。也就是两个控件的最左端在同一条线上
testArea.setAlignmentX(Component.LEFT_ALIGNMENT);
button. setAlignmentX(Component.LEFT_ALIGNMENT);
//容纳testArea和button的容器,对他们採用沿Y轴(从上往下)放置,而且文本域最左端和按纽的最右端在同一条线上
testArea.setAlignmentX(Component.LEFT_ALIGNMENT);
button. setAlignmentX(Component.RIGHT_ALIGNMENT);
setAlignmentX(left,right)仅仅有在布局是BoxLayout.Y_AXIS才效,而setAlignmentY(top,button)在布局为BoxLayout.X_AXIS才效果。
组件对齐一般来说:
全部top-to-bottom BoxLayout object 应该有同样的 X alignment。
全部left-to-right Boxlayout应该有同样的 Y alignment
setAlignmentX 和setAlignmentY 能够实现对齐。
GridBagLayout布局管理器:
这就是最复杂的一个布局管理器了,网格包布局.在此布局中,组件大小不必同样.
GridBagLayout gb=new GridBagLayout();
ContainerName.setLayout(gb);
以上代码是让容器获得一个GridBagLayout .
要使用网格包布局,还必须有其一个辅助类,GridBagContraints.它包括GridBagLayout类用来定位及调整组件大小所须要的所有信息.使用过程例如以下:
1).创建网格包布局的一个实例,并将其定义为当前容器的布局管理器.
2).创建GridBagContraints的一个实例
3).为组件设置约束.
4).通过方法统治布局管理器有关组件及其约束等信息
5).将组件加入到容器.
6).对各个将被显示的组件反复以上步骤..
GridBagContraints类的成员变量列表例如以下:
1).gridx,gridy
指定组件放在哪个单元中.其值应该设为常数CridBagConstraints.RELATIVE .然后按标准顺序将组件加入网格包布局.从左到右,从上到下.
2).gridwidth,gridheight
指定组件将占用几行几列
3).weightx,weighty
指定在一个GridBagLayout中应怎样分配空间.缺省为0.
4).ipadx,ipady
指定组件的最小宽度和高度.可确保组件不会过分收缩.
5).fill
指定在单元大于组件的情况下,组件怎样填充此单元..缺省为组件大小不变.下面为静态数据成员列表,它们是fill变量的值.
GridBagConstraints.NONE 不改变组件大小
GridBagConstraints.HORIZONTAL 添加组件宽度,使其水平填充显示区域
GridBagConstraints.VERTICAL 添加组件高度,使其垂直填充显示区域
GridBagConstraints.BOTH 使组件填充整个显示区域
6).anchor
假设不打算填充能够通过anchor指定将组件放置在单元中的位置,缺省为将其放在单元的中部.可使用下面静态成员:
GridBagConstraints.CENTER
GridBagConstraints.NORTH
GridBagConstraints.EAST
GridBagConstraints.WEST
GridBagConstraints.SOUTH
GridBagConstraints.NORTHEAST
GridBagConstraints.SOUTHEAST
GridBagConstraints.NORTHWEST
GridBagConstraints.SOUTHWEST
使用setConstraints()方法能够设置各组件约束.
GridBagLayout是是在GridLayout的基础上发展起来的,是五种布局策略中使用最复杂,功能最强大的一种,它是在GridLayout的基础上发展起来的。由于GridBagLayout中每一个网格都同样大小并且强制组件与网格大小同样,使得容器中的每一个组件也都是同样的大小,显得非常不自然,并且组件假如容器中必须依照固定的行列顺序,不够灵活。在GridBagLayout中,能够为每一个组件指定其包括的网格个数,组件能够保留原来的大小,能够以随意顺序随意地增加容器的任何位置,从而实现真正自由地安排容器中每一个组件的大小和位置。
通过创建一个gridBagConstraints实例为组件设置布局參数:
gridx, gridy
gridwidth, gridheight
fill
ipadx, ipady
insets
anchor
CENTER (the default), NORTH, NORTHEAST, EAST, SOUTHEAST, SOUTH, SOUTHWEST, WEST, and NORTHWEST.
weightx, weighty
变量名 |
有效值 |
应用范围 |
定义 |
anchor |
CENTER EAST NORTH NORTHEAST SOUTH SOUTHWEST WEST |
组件 |
组件在网格中排放的位置 |
fill |
BOTH HORIZONTAL VERTICAL NONE |
组件 |
组件填充网格的方式 |
gridx,gridy |
RELATIVE 整数X,Y值 |
组件和显示区 |
组件的左上角网格的位置 |
gridheight gridwidth |
1 RELATIVE REMAINDER 宽,高度整数值 |
显示区 |
网格单元中组件显示区所占的高度和宽度 |
Insets |
(0,0,0,0) |
组件和显示区 |
外部填充 |
ipadx,ipady |
0 |
组件和显示区 |
内部填充 |
JAVA布局管理器的更多相关文章
- Java——布局管理器
在Swing中使用的所有布局管理器都可以实现LayoutManager接口,在Swing中主要使用的5种布局管理器:FlowLayout.BorderLayout.GridLayout.CardLay ...
- java 布局管理器
容器中的组件的排放方式,就是布局. 常见的布局管理器: FlowLayout(流式布局管理器)//目前最常用的 从左到右的顺序排列. Panel默认的布局管理器. BorderLayout(边界布局管 ...
- Java可视化编程,基于布局管理器的UI设计
在<事件驱动模型>讲述了如何将用户与功能实现代码联系到一起.怎么样便于用户理解和符合用户的使用习惯? 本篇还是就此问题作分析,站在用户角度上分析UI各组件倒底该如何设计呈现. 优秀的UI会 ...
- Qt之自定义布局管理器(QCardLayout)
简述 手动布局另一种方法是通过继承QLayout类编写自己的布局管理器. 下面我们详细来举一个例子-QCardLayout.它由同名的Java布局管理器启发而来.也被称之为卡片布局,每个项目偏移QLa ...
- java基础 布局管理器
概念: 组建在容器(比如JFrame)中的位置和 大小 是由布局管理器来决定的.所有的容器都会使用一个布局管理器,通过它来自动进行组建的布局管理. 种类: java共提供了物种布局管理器:流式布局管理 ...
- Java Swing 第03记 布局管理器
几种Swing常用的布局管理器 BorderLaout 它将容器分为5个部分,即东.南.西.北.中,每一个区域可以容纳一个组件,使用的时候也是通过BorderLayout中5个方位常量来确定组件所在的 ...
- Java基础之创建窗口——使用网格布局管理器(TryGridLayout)
控制台程序. 网格布局管理器可以在容器的矩形网格中布局组件. import javax.swing.*; import java.awt.*; import javax.swing.border.Et ...
- Java基础之创建窗口——使用卡片布局管理器(TryCardLayout)
控制台程序. 卡片布局管理器会生成一叠组件——一个组件放在另一个组件的上面.添加到容器中的第一个组件在堆栈的顶部,因此是可见的,添加的最后一个组件在堆栈的底部.使用默认的构造函数CardLayout( ...
- Java基础之创建窗口——使用边界布局管理器(TryBorderLayout)
控制台程序. 边界布局管理器最多能在容器中放置5个组件.在这种布局管理器中,可以把组件放在容器的任意一个边界上,也可以把组件放在容器的中心.每个位置只能放置一个组件.如果把组件放置在已被占用的边界上, ...
随机推荐
- JavaScript实现私有属性
原文:JavaScript实现私有属性 JavaScript被很多人认为并不是一种面向对象语言,原因有很多种,比如JavaScript没有类,不能提供传统的类式继承:再比如JavaScript不能实现 ...
- 如何诊断crs 安装时 root.sh 脚本执行错误
troubleshooting root.sh problem ------*for 10g and 11.1 1.查证公网,私网的节点名是可以互相ping通的 2.---查证OCR/Voting 文 ...
- Educational Codeforces Round 9
Educational Codeforces Round 9 Longest Subsequence 题目描述:给出一个序列,从中抽出若干个数,使它们的公倍数小于等于\(m\),问最多能抽出多少个数, ...
- OSCHina技术导向:Java WEB企业门户平台Liferay
Liferay 是一个完整的门户解决方案,基于J2EE的应用,使用了EJB以及JMS等技术,前台界面部分使用Struts MVC 框架,基于XML的portlet配置文件可以自由地动态扩展,使用了We ...
- 电子科大POJ "敲错键盘"
C-sources: #include<stdio.h> #define N 20 int main() { int i,j; ]={'Q','W','E','R','T','Y','U' ...
- Java琐碎知识点
jps命令是JDK1.5提供的一条显示当前用户的所有java进程pid的指令,类似Linux上的ps命令简化版,Windows和linux/unix平台都可以用比较常用的参数:-q:只显示pid,不显 ...
- Qt之再谈窗体阴影
前面就窗口阴影已经写过一篇博客,使用九宫格的思路实现的,在我看来,凡是用程序能实现的尽量不要使用图片代替(在保证效率的前提下),今天再次分享关于我的一些小见解! 先看效果: 窗口阴 ...
- Fix Elementary Boot Screen (plymouth) After Installing Nvidia Drivers
Q:I just installed propietary nvidia drivers, after that the glowing “e” plymouth theme was gone, on ...
- 从头开始-07.Foundation框架常用结构体
一.Foundation框架常用结构体NSRange\CGRange.NSPoint\CGPoint.NSSize\CGSize. NSRect\CGRect 的使用 1. 基本使用: //NSRa ...
- UVA 1660 Cable TV Network
题意: 求一个无向图的点连通度. 分析: 把一个点拆成一个入点和一个出点,之间连一条容量为1的有向边,表示能被用一次.最大流求最小割即可.套模板就好 代码; #include <iostream ...