布局管理器

Java的GUI组件都放置在容器中,他们的位置是由容器的布局管理器来管理的.在前面的程序中,并没有指定将OK按钮放置在框架的什么位置,但是,Java知道应该把它放置在哪里,因为在后台工作的布局管理器能够将组件放到正确的位置.布局管理器是使用布局管理器类创建的.

我们可以使用setLayout() 方法在容器中设置布局管理器.

我们将要了解FlowLayout GridLayout BorderLayout

FlowLayout流式布局

FlowLayout(流式布局)是最简单布局管理器. Jpanel容器默认的布局管理器

流式布局,按照组件添加的顺序,从左到到右将组件排列在容器中.当放满一行,就开始新的一行.在FlowLayout有3个常量FlowLayout可以指定组件的对齐方式.

LEFT   每一行组件都应该是左对齐的

RIGHT  每一行组件都应该是右对齐的

CENTER  每一行组件都应该是居中的

还可以指定组件之间的以像素为单位的间隔.

intgetHgap()

获取组件之间以及组件与 Container 的边之间的水平间隙。intgetVgap()

获取组件之间以及组件与 Container 的边之间的垂直间隙。void setHgap(inthgap)

设置组件之间以及组件与 Container 的边之间的水平间隙。void setVgap(intvgap)

设置组件之间以及组件与 Container 的边之间的垂直间隙。

这个布局管理器的对其方式默认值是CENTER

这个布局管理器的水平间隔默认值是 5个像素

这个布局管理器的垂直间隔默认是是5个像素

创建该布局管理器

FlowLayout()

构造一个新的 FlowLayout,它是居中对齐的,默认的水平和垂直间隙是5个单位。

FlowLayout(intalign)

构造一个新的 FlowLayout,它具有指定的对齐方式,默认的水平和垂直间隙是5个单位。

FlowLayout(int align, int hgap, intvgap)

创建一个新的流布局管理器,它具有指定的对齐方式以及指定的水平和垂直间隙。

案例:创建框架,使用流失布局管理器.向该框架添加三个标签和文本域.

public class ShowFlowLayout extendsJFrame {publicShowFlowLayout() {super.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 20));

add(new JLabel("姓名:"));

add(new JTextField(8));

add(new JLabel("邮箱:"));

add(new JTextField(8));

add(new JLabel("电话:"));

add(new JTextField(8));

}public static voidmain(String[] args) {

ShowFlowLayout frame= newShowFlowLayout();

frame.setTitle("FlowLayout");

frame.setSize(500, 200);

frame.setLocationRelativeTo(null);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setVisible(true);

}

}

该案例在本类main方法中创建了一个本类对象. 该类的构造函数中创建并且添加组件.

该案例使用了FlowLayout管理器在框架放置组件.如果改变框架的大小.组建会自动的重新排列,以适应框架.

例如:

如果将同一个按钮在框架中添加10次,那么该框架只会出现一次,将一个按钮向容器中添加多以和一次是一样的.

GridLayout网格布局

GridLyaout是以网格形式管理组件的.组件按照他们添加的顺序从左到右排列,显示第一行,接着是第二行,一次类推.

Gridlayout可以指定网格中的行数和列数

规则如下:

行数和列数可以是0但是不能两者都为0.

如果一个为0另外一个不为0,那么不为0的行或列的大小就是固定的,为0的行或者列有布局管理器动态决定.

例如:如果指定一个网格有0行3列10个组件,GirdLayout会创建3个固定的列和行,最后一行只有一个组件.如果指定一个网格有3行0列10个组件,GridLayout就会创建3行4列,最后一行包含2个组件.

如果行数和列数都不为0,那么以行数为依据.所以行数是固定的,布局管理器会动态的计算列数.例如,如果指定一个网格有3行3列10个组件,GridLayout会创建3个固定的行和4列,最后一行包含2个组件.

构造方法

GridLayout()

创建具有默认值的网格布局,即每个组件占据一行一列。

GridLayout(int rows, intcols)

创建具有指定行数和列数的网格布局。

GridLayout(int rows, int cols, int hgap, intvgap)

创建具有指定行数和列数,水平间隔,垂直间隔的网格布局。

方法:

intgetRows()

获取此布局中的行数。 默认值是1intgetColumns()

获取此布局中的列数。 默认值是1intgetHgap()

获取组件之间的水平间距。 默认值是0intgetVgap()

获取组件之间的垂直间距。默认值是0

设置void setRows(introws)

将此布局中的行数设置为指定值。默认值是1void setColumns(intcols)

将此布局中的列数设置为指定值。 默认值是1void setHgap(inthgap)

将组件之间的水平间距设置为指定值。 默认值是0void setVgap(intvgap)

将组件之间的垂直间距设置为指定值。默认值是0

案例:该案例依然添加3个标签和3个文本域,只不过布局管理器是GrigLayout

public class ShowGridLayout extendsJFrame {publicShowGridLayout() {

setLayout(new GridLayout(3, 2, 5, 5));

add(new JLabel("姓名:"));

add(new JTextField(8));

add(new JLabel("邮箱:"));

add(new JTextField(8));

add(new JLabel("电话:"));

add(new JTextField(8));

}public static voidmain(String[] args) {

ShowGridLayout frame= newShowGridLayout();

frame.setTitle("GridLayout");

frame.setSize(200, 125);

frame.setLocationRelativeTo(null);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setVisible(true);

}

}

例如:

如果使用setLayout(new GridLayout(3,10))替换setlayout语句,还是会得到3行2列,因为行的参数非零,所以列的参数会被忽略.列的实际参数是由布局管理器计算出来的.

BorderLayout边框布局

边框布局,JFrame 容器默认的布局管理器是边框布局.该管理器将容器非为东西南北中5个区域.我们使用add(Component,index)方法可以将组件添加进到BorderLayout中,index是一个常量,有5个值

EAST

东区域的布局约束(容器右边)。

WEST

西区域的布局约束(容器左边)。

SOUTH

南区域的布局约束(容器底部)。

NORTH

北区域的布局约束(容器顶部)。

CENTER

中间区域的布局约束(容器中央)。

构造函数

BorderLayout()

构造一个组件之间没有间距的新边框布局。

BorderLayout(int hgap, intvgap)

构造一个具有指定组件间距的边框布局。

方法:

intgetHgap()

返回组件之间的水平间距。intgetVgap()

返回组件之间的垂直间距。void setHgap(inthgap)

设置组件之间的水平间距。 默认值是0void setVgap(intvgap)

设置组件之间的垂直间距。默认值是0

组件会根据他们最合适的尺寸和在容器中的位置来放置,南北组件可以水平拉伸,东西组件可以垂直拉伸,中央组件既可以水平拉伸也可以垂直拉伸.

案例:演示边框布局管理器

public class ShowBorderLayout extendsJFrame {publicShowBorderLayout() {

setLayout(new BorderLayout(5, 10));

add(new JButton("东"), BorderLayout.WEST);

add(new JButton("西"), BorderLayout.EAST);

add(new JButton("南"), BorderLayout.SOUTH);

add(new JButton("北"), BorderLayout.NORTH);

add(new JButton("中"), BorderLayout.CENTER);

}public static voidmain(String[] args) {

ShowBorderLayout frame= newShowBorderLayout();

frame.setTitle("BorderLayout");

frame.setSize(300, 200);

frame.setLocationRelativeTo(null);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setVisible(true);

}

}

注意: 如果布局管理器为Border管理器,调用add方法,没有说明组件的位置(东西南北中)默认是center.

所以

add(new JButton("ok"))和 add(new JButton("ok"), BorderLayout.CENTER )

效果是一样的.

如果在Border容器中添加2个组件,都没有指定位置,那么只会显示最后一个组件

add(new JButton("ok1"))和add(new JButton("ok2")) 只会显示ok2

使用布局管理器

代码:

public class CommonComponent extendsJFrame {publicCommonComponent() {//菜单条

JMenuBar bar = newJMenuBar();//菜单

JMenu menu = new JMenu("文件");//菜单选项

JMenuItem myNew = new JMenuItem("新建");

JMenuItem myOpen= new JMenuItem("打开");

bar.add(menu);

menu.add(myNew);

menu.add(myOpen);

add(bar, BorderLayout.NORTH);//面板

JPanel p1 = newJPanel();

p1.setLayout(new GridLayout(2, 2, 5, 5));

add(p1);//标签

JLabel name = new JLabel("用户名:");

p1.add(name);//文本域

JTextField field = new JTextField(8);

p1.add(field);//标签

JLabel passwd = new JLabel("密码");

p1.add(passwd);//密码域

JPasswordField pass = new JPasswordField(8);

p1.add(pass);

JPanel p2= newJPanel();//单选按钮

JLabel gender = new JLabel("性别");

p2.add(gender);

JRadioButton male= new JRadioButton("男");

JRadioButton female= new JRadioButton("女");//单选按钮组,同一个单选按钮组的互斥.

ButtonGroup group = newButtonGroup();

group.add(male);

group.add(female);//注意,单选按钮组不能添加进容器

p2.add(male);

p2.add(female);

JPanel p3= newJPanel();//复选框

JLabel like = new JLabel("爱好:");

p3.add(like);

JCheckBox eat= new JCheckBox("吃饭");

JCheckBox movie= new JCheckBox("看电影");

JCheckBox sleep= new JCheckBox("睡觉");

p3.add(eat);

p3.add(movie);

p3.add(sleep);

JPanel p4= new JPanel(new GridLayout(1, 0, 5, 5));//文本域

JLabel info = new JLabel("个人简介:");

p4.add(info);

JTextArea area= new JTextArea(50, 10);

p4.add(area);

JPanel p5= new JPanel(newBorderLayout());//列表

String[] data = { "one", "two", "three"};

JList list= newJList(data);

p5.add(list, BorderLayout.WEST);

JPanel p6= newJPanel();//普通按钮

JButton button = new JButton("注册");

p6.add(button);

JButton button2= new JButton("取消");

p6.add(button2);

setLayout(new GridLayout(7, 1, 5, 5));

add(p1);

add(p2);

add(p3);

add(p4);

add(p5);

add(p6);

}public static voidmain(String[] args) {

CommonComponent frame= newCommonComponent();

frame.setTitle("常用组件");

frame.setSize(400, 600);

frame.setLocationRelativeTo(null);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//自适应//frame.pack();

frame.setVisible(true);

}

}

格式如下:

需求:需要在一个Jframe框架中放置10个按钮和一个文本域.

要求按钮以网格形式放置,文本域单独一行.

如果将这些组件放在一个单独的容器中,很难达要去的效果.我们使用Java图形用户界面进行程序设计时,可以将一个窗口分成几个面板Jpanel.面板的作用就是分组放置用户界面的子容器.这里可以将按钮添加到一个面板中,然后经面板添加到框架中.

在Swing中的面板是JPanel 可以使用new Jpanel () 创建一个默认是FlowLayout管理器的面板,也可以使用newJPanel(LayoutManager) 创建一个带特定布局管理器的面板.使用add方法将组件添加进面板中.

例如:

public class ShowJPanel extendsJFrame {

ShowJPanel() {

JButton button= new JButton("ok");

JPanel jPanel= newJPanel();

jPanel.add(button);

add(jPanel);

}public static voidmain(String[] args) {

ShowJPanel frame= newShowJPanel();

frame.setTitle("面板");

frame.setSize(200, 200);

frame.setLocationRelativeTo(null);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setVisible(true);

}

}

图示:

进按钮添加进面板面板添加进容器

进按钮直接添加进框架.

案例:

public class TestPanel extendsJFrame {publicTestPanel() {//创建面板,默认是流式布局

JPanel p1 = newJPanel();//指定为网格布局,4行3列

p1.setLayout(new GridLayout(4, 3));for (int i = 1; i <=9; i++) {

p1.add(new JButton("" +i));

}

p1.add(new JButton("0"));

p1.add(new JButton("OK"));

p1.add(new JButton("EXIT"));//创建面板,指定边框布局

JPanel p2 = new JPanel(newBorderLayout());//面板添加文本域,边框北部

p2.add(new JTextField("我在这里啊!!!"), BorderLayout.NORTH);//面板添加其他面板,边框中部.

p2.add(p1, BorderLayout.CENTER);//框架添加面板,框架的布局默认就是边框布局,面板指定位于框架西部

add(p2, BorderLayout.EAST);//框架添加按钮,位于框架总部.

add(new JButton("哈哈"), BorderLayout.CENTER);

}public static voidmain(String[] args) {

TestPanel frame= newTestPanel();

frame.setTitle("JPanel");

frame.setSize(400, 260);

frame.setLocationRelativeTo(null);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setVisible(true);

}

}

该案例中创建了两个面板(Jpanel) , 面板的默认布局是流式布局.,可以使用setLayout 更改面板的布局( setLayout 是java.awt.Container定义的, Jpanel 是Container的子类).

该案例中

面板p1布局指定为GridLayout(网格布局)将12个按钮,添加进面板p1中.

面板p2 布局指定为BorderLayout,将p1面板添加进来, p1位于该面板的中部.再添加一个文本域,位于面板p2北部.

将面板p2添加进框架(框架布局默认为BorderLayout),位于框架的西部,在框架的中部添加一个按钮.

效果:

注意: 面板容器是一个轻量级的容器,该容器不能单独的使用,必须依赖与外层的顶层容器(JFrame)

java在菜单的布局实例_6.Java-GUI布局管理器相关推荐

  1. java 布局实例,HarmonyOS Java UI之StackLayout布局示例

    StackLayout简介 StackLayout意为堆叠布局,用于在屏幕上保留一个区域来显示组件,实现特殊的功能.通常,堆叠布局中只应该放置一个子组件,如果存在多个子组件,则显示最新的组件.这个布局 ...

  2. java自旋锁使用_实例讲解Java 自旋锁

    一直以来不是怎么清楚自旋锁,最近有点时间,好好的学习了一下: 所谓的自旋锁在我的理解就是多个线程在尝试获取锁的时候,其中一个线程获取锁之后,其他的线程都处在一直尝试获取锁的状态,不会阻塞!!!那么什么 ...

  3. Expression Blend实例中文教程(11) - 视觉管理器快速入门Visual State Manager(VSM)

    Visual State Manager,中文又称视觉状态管理器(简称为VSM),是Silverlight 2中引进的一个概念.通过使用VSM,开发人员和设计人员可以轻松的改变项目控件的视觉效果,在项 ...

  4. java hanlp分词_Hanlp分词实例:Java实现TFIDF算法

    算法介绍 最近要做领域概念的提取,TFIDF作为一个很经典的算法可以作为其中的一步处理. 关于TFIDF算法的介绍可以参考这篇博客http://www.ruanyifeng.com/blog/2013 ...

  5. java thread exit方法_实例分析Java终止线程和stop()方法

    Java终止线程实例和stop()方法源码阅读 了解线程 概念 线程 是程序中的执行线程.Java 虚拟机允许应用程序并发地运行多个执行线程. 线程特点 拥有状态,表示线程的状态,同一时刻中,JVM中 ...

  6. java io 文件复制_实例讲述Java IO文件复制

    前言:IO流主要分为两大类,分别是字节流与字符流 注意: 1.音频文件.图片.视频(范围广),就用字节流 2.只涉及到文本的,就用字符流 使用字节流复制文本内容(其他文件也可以) 代码如下: impo ...

  7. java获取u盘_实例分享java监听u盘的方法

    package org.load.u; import java.io.File; import java.util.LinkedHashMap; import java.util.Map; // U盘 ...

  8. java pdf添加图章_实例讲解Java处理PDF图章的方法

    图章(印章)是一种在合同.票据.公文等文件中表明法律效应.部门机关权威的重要指示物,常见于各种格式的文件.文档中.对于纸质文档可以手动盖章,但对于电子文档,则需要通过特定的方法来实现.本篇文档分享通过 ...

  9. html5响应式布局实例,CSS3响应式布局案例

    布局结果图: 电脑全屏: 手机浏览: 竖屏: 横屏: 代码: 响应式布局 * { margin: 0; padding: 0; } html, body { height: 100%; font: 2 ...

最新文章

  1. 语言中什么时候加大括号_日本留学语言学校申请季你知道是几月吗?从什么时候开始准备...
  2. java 系统 类_JAVA系统类 System的简单整理
  3. 计算机机房双电源供电,超高效数据机房可靠性浅析——走进腾讯青浦云计算中心...
  4. 被 Kafka 虐的日子,太惨了……
  5. codeforces1301 F. Super Jaber(多源bfs+枚举)
  6. 《Effective Java》读书笔记 Item 1:考虑静态工厂方法,而不是构造器
  7. pmw调光c语言程序,51单片机led灯渐变PWM调光(渐亮渐灭)C语言和汇编源程序
  8. python程序设计教程上海交通大学_上海交通大学 python程序设计课程PPT Ch2.ppt
  9. 中国半导体蚀刻设备行业市场供需与战略研究报告
  10. 《C++ Primer Plus 6th》读书笔记 - 第十一章 使用类
  11. Redis入门整合springboot
  12. 模拟铁路12306售票系统的设计与实现
  13. 【Matlab】求解函数导数
  14. oracle 有if语句吗,oracle的if语句
  15. 缺陷报告单写作准则(5C)
  16. 计算机所需要的数学基础知识,学计算机需要什么基础 数学不好能学计算机吗...
  17. Revit二次开发——revit怎么给桥梁加钢筋
  18. ServU漏洞利用靶场-单兵作战
  19. MacBook替换登录界面壁纸
  20. ToolBar 修改菜单字体和颜色

热门文章

  1. AI黑科技,无人驾驶中都用到了哪些机器学习算法
  2. 基于深度学习实现语义识别和问答判断模型及算法优化-制造业-CSDN公开课-专题视频课程...
  3. Android渣本毕业四年,面试小厂面试官说我可以试试大厂
  4. SpringMVC 国际化-中英文切换
  5. 刘强东年底每天要开一千家店;联通将关2G;王兴否认摩拜裁员丨价值早报
  6. 淘宝网店如何寻找产品卖点
  7. 扬帆优配|多只“迷你基”清盘未果业绩反领跑 盲目追捧有风险
  8. 寻找#Moonbeam全球大使
  9. Docker 9:Docker 管理界面 Portainer
  10. Linux系统操作汇总(包含Linux中软件操作)