原文地址:java布局管理器总结作者:技术羊

之前在使用的过程中一直对java中swing的布局管理器感到很困惑,以下是在网上找到的一篇文章。其中我重点关注了一下gridbaglayout。写的比较详尽:

  1. BorderLayout

  2. FlowLayout

  3. GridLayout

  4. GridBagLayout

  5. CardLayout

  6. BoxLayout


1.BorderLayout

java.lang.Object

--java.awt.BorderLayout

将版面划分成东、西、南、北、中五个区域,将添加的组件按指定位置放置。

构造函数:

BorderLayout()

建立组件间无间距的BorderLayout

BorderLayout(int hgap,int vgap)

建立组件间水平间距为hgap,垂直间距为vgap的BorderLayout

例一:

[java] view plain copy
  1. import java.awt.BorderLayout;
  2. import javax.swing.JFrame;
  3. import javax.swing.JButton;
  4. public class BorderLayoutDemo {
  5. public static void main(String[] args) {
  6. //建立一个JFrame,JFrame的默认LayoutManager为BorderLayout
  7. JFrame f=new JFrame("BorderLayout");
  8. JButton btn=new JButton("BorderLayout.NORTH");
  9. f.add(btn,BorderLayout.NORTH);
  10. btn=new JButton("BorderLayout.SOUTH");
  11. f.add(btn,BorderLayout.SOUTH);
  12. btn=new JButton("BorderLayout.EAST");
  13. f.add(btn,BorderLayout.EAST);
  14. btn=new JButton("BorderLayout.West");
  15. f.add(btn,BorderLayout.WEST);
  16. btn=new JButton("BorderLayout.CENTER");
  17. f.add(btn,BorderLayout.CENTER);
  18. f.pack();
  19. f.setVisible(true);
  20. f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  21. }
  22. }

运行结果:

在上例代码的第13,14行之间插入以下代码

[java] view plain copy
  1. f.setLayout(new BorderLayout(10,10));

运行结果:


2.FlowLayout

java.lang.Object

--java.awt.FlowLayout

组件按从左到右而后从上到下的顺序依次排列,一行不能放完则折到下一行。

构造函数

FlowLayout()

建立一个默认为居中对齐,组件彼此有5单位的水平与垂直间距的FlowLayout

FlowLayout(int align)

建立一个可设置排列方式且组件彼此有5单位的水平与垂直间距的FlowLayout

FlowLayout(int align,int hgap,int vgap)

建立一个可设置排列方式与组件间距的FlowLayout

例二:

[java] view plain copy
  1. import java.awt.FlowLayout;
  2. import javax.swing.JFrame;
  3. import javax.swing.JButton;
  4. public class FlowLayoutDemo {
  5. public static void main(String[] args) {
  6. JFrame f=new JFrame("FlowLayout");
  7. f.setLayout(new FlowLayout());
  8. for(int i=0;i<7;i++){
  9. JButton btn=new JButton("Button"+i);
  10. f.add(btn);
  11. }
  12. f.setSize(300,150);
  13. f.setVisible(true);
  14. f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  15. }
  16. }

运行结果:


3.GridLayout

java.lang.Object

--java.awt.GridLayout

矩形网格形式对容器的组件进行布置

构造函数

GridLayout()

建立一个默认为一行一列的GridLayout

GridLayout(int rows,int cols)

建立一个指定行(rows)和列(cols)的GridLayout

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

建立一个指定行(rows)和列(cols),且组件间水平间距为hgap、垂直间距为vgap的GridLayout

例三:

[java] view plain copy
  1. import java.awt.GridLayout;
  2. import javax.swing.JFrame;
  3. import javax.swing.JButton;
  4. public class GridLayoutDemo {
  5. public static void main(String[] args) {
  6. JFrame f=new JFrame("GridLayout");
  7. //设置f的布局管理器为3行3列的GridLayout,组件间水平与垂直间距为5
  8. f.setLayout(new GridLayout(3,3,5,5));
  9. for(int i=1;i<10;i++){
  10. JButton btn=new JButton(String.valueOf(i));
  11. f.add(btn);
  12. }
  13. f.pack();
  14. f.setVisible(true);
  15. f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  16. }
  17. }

运行结果:


4.GridBagLayout

java.lang.Object

--java.awt.GridBagLayout

GridBagLayout以表格形式布置容器内的组件,将每个组件放置在每个单元格内,而一个单元格可以跨越多个单元格合并成一个单元格,即多个单元格可以组合成一个单元格,从而实现组件的自由布局。

构造函数

GridBagLayout()

建立一个默认的GridBagLayout

每一个单元格都有各自的属性,而这些属性由GridBagConstrainsts类的成员变量来定义,且GridBagConstriaints中的所有成员变量都是public的。

java.lang.Object

--java.awt.GridBagConstratints

构造函数:

GridBagConstraints()

建立一个默认的GridBagConstraints

GridBagConstraints(intgridx,int gridy,int gridwidth,int gridheight,double weightx,double weighty,int anchor,int fill,Insets insets,int ipadx,int ipady)

建立一个指定其参数值的GridBagConstraints

GridBagConstraints的成员变量:

  • int gridx
  • int gridy
  • int gridwidth
  • int gridheight
  • double weightx
  • double weighty
  • int anchor
  • int fill
  • Insets insets
  • int ipadx
  • int ipady

gridx,gridy:设置组件所处行与列的起始坐标。例如gridx=0,gridy=0表示将组件放置在0行0列单元格内。

gridwidth,gridheight:设置组件横向与纵向的单元格跨越个数。

可以通过GridBagConstraints的RELETIVE,和REMAINDER来进行指定,它的用法是:

当把gridx值设置为GridBagConstriants.RELETIVE时,所添加的组件将被放置在前一个组件的右侧。同理,对gridy 值设置为GridBagConstraints.RELETIVE时,所添加的组件将被放置在前一个组件的下方,(这是一种根据前一个组件而决定当前组 件的相对放置方式)

对gridweight和gridheight也可以应用GridBagConstraints的REMAINDER方式,创建的组件会从创建的起点位置 开始一直延伸到容器所能允许的界限为止。该功能使得你可以创建跨越某些行或列的组件,从而改变相应方向上组件的数目,即使其后在布局的其他地方添加额外的组件也是如此。

weightx,weighty:设置窗口变大时的缩放比例。

anchor:设置组件在单元格中的对齐方式。由以下常量来定义

GridBagConstraints.CENTER

GridBagConstraints.EAST

GridBagConstraints.WEST

GridBagConstraints.SOUTH

GridBagConstraints.NORTH

GridBagConstraints.SOUTHEAST

GrisBagConstraints.SOUTHWEST

GridBagConstraints.NORTHEAST

GridBagConstraints.NORTHWEST

fill:当某个组件未能填满单元格时,可由此属性设置横向、纵向或双向填满。由以下常量来定义

GridBagConstraints.NONE

GridBagConstraints.HORIZONTAL

GridBagConstraints.VERTICAL

GridBagConstraints.BOTH

insets:设置单元格的间距。

java.lang.Object

--java.awt.Insets

Insets(int top,int left,int bottom,int right)

ipadx,ipady:将单元格内的组件的最小尺寸横向或纵向扩大。若一个组件的尺寸为30*10像素,ipadx=2,ipady=3,则单元格内的组件最小尺寸为34*16像素

例四:

[java] view plain copy
  1. import java.awt.GridBagLayout;
  2. import java.awt.GridBagConstraints;
  3. import java.awt.Insets;
  4. import javax.swing.JFrame;
  5. import javax.swing.JButton;
  6. public class GridBagLayoutDemo {
  7. public static void main(String[] args) {
  8. JFrame f=new JFrame("GridBagLayout");
  9. f.setLayout(new GridBagLayout());
  10. JButton btn=new JButton("first");
  11. GridBagConstraints gbc=new GridBagConstraints();
  12. //设定第一个单元格的属性值
  13. gbc.gridx=0;
  14. gbc.gridy=0;
  15. gbc.gridwidth=1;
  16. gbc.gridheight=1;
  17. gbc.weightx=0;
  18. gbc.weighty=0;
  19. gbc.anchor=GridBagConstraints.NORTHWEST;
  20. gbc.fill=GridBagConstraints.NONE;
  21. gbc.insets=new Insets(0,0,0,0);
  22. gbc.ipadx=0;
  23. gbc.ipady=0;
  24. f.add(btn,gbc);
  25. //设定第二个单元格属性值
  26. gbc.gridx=1;
  27. gbc.gridy=0;
  28. gbc.gridwidth=GridBagConstraints.REMAINDER;
  29. gbc.gridheight=1;
  30. gbc.weightx=1;
  31. gbc.weighty=0;
  32. gbc.anchor=GridBagConstraints.CENTER;
  33. gbc.fill=GridBagConstraints.HORIZONTAL;
  34. gbc.insets=new Insets(5,5,5,5);
  35. gbc.ipadx=0;
  36. gbc.ipady=0;
  37. btn=new JButton("second");
  38. f.add(btn,gbc);
  39. //设定第三个单元格属性值
  40. gbc.gridx=0;
  41. gbc.gridy=1;
  42. gbc.gridwidth=1;
  43. gbc.gridheight=GridBagConstraints.REMAINDER;
  44. gbc.weightx=0;
  45. gbc.weighty=1;
  46. gbc.anchor=GridBagConstraints.CENTER;
  47. gbc.fill=GridBagConstraints.VERTICAL;
  48. gbc.insets=new Insets(0,0,0,0);
  49. gbc.ipadx=10;
  50. gbc.ipady=10;
  51. btn=new JButton("three");
  52. f.add(btn,gbc);
  53. f.pack();
  54. f.setVisible(true);
  55. f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  56. }
  57. }

运行结果:

将窗口变大后的效果:


5.CardLayout

java.lang.Object

--java.awt.CardLayout

以层叠的方式布置组件,如同很多张卡片叠在一起,从而只能看到最上面的那一张卡片。

构造函数

CardLayout()

建立一个无间距的CardLayout

CardLayout(int hgap,int vgap)

建立一个水平间距为hgap、垂直间距为vgap的CardLayout

例五:

[java] view plain copy
  1. import java.awt.BorderLayout;
  2. import java.awt.CardLayout;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. import javax.swing.JFrame;
  6. import javax.swing.JPanel;
  7. import javax.swing.JLabel;
  8. import javax.swing.JButton;
  9. public class CardLayoutDemo {
  10. private static JPanel p;
  11. public static void main(String[] args) {
  12. JFrame f=new JFrame("CardLayout");
  13. p=new JPanel();
  14. //将JPanel p的LayoutManager设置为CardLayout
  15. p.setLayout(new CardLayout());
  16. //新建两个JPanel
  17. JPanel p1=new JPanel();
  18. JPanel p2=new JPanel();
  19. JLabel lb=new JLabel("first panel");
  20. p1.add(lb);
  21. lb=new JLabel("second panel");
  22. p2.add(lb);
  23. //将新建的两个JPanel p1,p2添加到p中
  24. p.add(p1,"frist");
  25. p.add(p2,"second");
  26. //设置默认显示first所对应的JPanel p1
  27. ((CardLayout)p.getLayout()).show(p, "frist");
  28. JButton cbtn=new JButton("Change");
  29. cbtn.addActionListener(new ActionListener(){
  30. public void actionPerformed(ActionEvent e) {
  31. //当按下Change按钮时,显示second 对应的JPanel p2
  32. ((CardLayout)p.getLayout()).show(p, "second");
  33. }
  34. });
  35. f.add(cbtn,BorderLayout.NORTH);
  36. f.add(p,BorderLayout.CENTER);
  37. f.setSize(400,150);
  38. f.setVisible(true);
  39. f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  40. }
  41. }

运行结果:

按下Change按钮后的结果:


6.BoxLayout

java.lang.Object

--javax.swing.BoxLayout

以嵌套式盒子来管里容器的布局,通过将组件放入水平或垂直形盒子以多层嵌套的方式进行布局。

构造函数

BoxLayout(Container target,int axis)

建立一个水平或垂直的BoxLayout,BoxLayout提供两个常数X_AXIS和Y_AXIS来表示水平或垂直排列。

说到BoxLayout,就不得不提到Box这个Container,Box这个Container默认的Layout为BoxLayout,而它只能使用这个Layout,否则编译时会有Error产生。

java.lang.Object

--javax.swing.Box

Box有水平的和垂直的两种形式。

构造函数

Box(int axis)

建立一个Box Container(容器),并指定组件的排列方式,通过使用BoxLayout提供的两个常数X_AXIS和Y_AXIS来指定。

方法

public static Box createHorizontalBox()

构造一个水平排列的Box组件。

[java] view plain copy
  1. import javax.swing.Box;
  2. import javax.swing.JFrame;
  3. import javax.swing.JButton;
  4. public class BoxLayoutDemo {
  5. public static void main(String[] args) {
  6. JFrame f=new JFrame("BoxLayout");
  7. //创建水平Box组件
  8. Box box=Box.createHorizontalBox();
  9. JButton btnA=new JButton("A");
  10. JButton btnB=new JButton("B");
  11. box.add(btnA);
  12. box.add(btnB);
  13. f.add(box);
  14. f.pack();
  15. f.setVisible(true);
  16. f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  17. }
  18. }

运行结果:

public static Component createHorizontalGlue()

构造一个Glue组件可向水平方向延伸。

在上例17,18行间插入以下代码

[java] view plain copy
  1. box.add(Box.createHorizontalGlue());

运行结果:

将窗口变大后的效果:

public static Component createHorizontalStrut(int width)

构造一个水平指定宽度的Strut组件。

将上例代码改成以下代码

[java] view plain copy
  1. box.add(Box.createHorizontalStrut(50));

运行结果:

public static Component createRigidArea(Dimension d)

构造一个指定长宽的二维Rigid组件。

将上例代码改成以下代码

[java] view plain copy
  1. box.add(Box.createRigidArea(new Dimension(50,50)));

运行结果:

public static Box createVerticalBox()

构造一个垂直排列的Box组件。

public static Component createVerticalGlue()

构造一个垂直的Glue组件。

public static Component createVerticalStrut(int height)

构造一个垂直的Strut组件。

public static Component createGlue()

构造一个Glue组件可向水平方向延伸。

Box.Fillter

Fillter是Box的inner class(内部类),它的功能与Rigid相似,都可以指定长宽的大小限制,且Fillter可以指定最大、较佳、最小的长宽大小。

转载于:https://www.cnblogs.com/kendn/p/8353202.html

javax.swing.jFrame相关推荐

  1. 2、Java Swing JFrame和JPanel:窗口容器和面板容器

    在 Swing 中,任何其他组件都必须位于一个顶层容器中. JFrame 窗口和 JPanel 面板是常用的顶层容器,本节详细介绍这两个容器的使用方法. JFrame 窗口 JFrame 用来设计类似 ...

  2. javax.swing的基本组成

    目录 一.基本容器 1.1 JFrame 1.2 JDialog 二.基本布局 2.1 AbsoluteLayout 2.2 BorderLayout 2.3 FlowLayout 2.4 GridL ...

  3. java jframe教程_Java Swing JFrame窗口的实现

    1. 概述 官方JavaDocsApi: javax.swing.JFrame JFrame,窗口.JFrame 是一个可以独立显示的组件,一个窗口通常包含有标题.图标.操作按钮(关闭.最小化.最大化 ...

  4. javax.swing设计的系统登录界面

    特点:没有JFrame自带的边框图标等,所有的容器都看不到JFrame原始样子,支持拖动任意位置 隐藏JFrame图标任务栏 jdk1.7以上可以隐藏JFrame图标任务栏 (jframe.setTy ...

  5. The package javax.swing is not accessible错误的三种解决办法,亲测有效

    万次阅读,150+点赞,如若对您有帮助,请及时点赞,不要白嫖!! 解决办法①:更换JRE系统库的版本 解决办法②:另外一个比较暴力的解决办法是点击java.swing.*; 解决办法③:之前导包失败的 ...

  6. The package javax.swing is not accessible(java GUI 编程时引用swing包和awt包时会报错怎么办)

    Java GUI 编程时引用swing包和awt包时会报错怎么办 一.环境与错误现象 使用的编译器为eclipse,情况为: 二.解决方法 问题主要是由工程中的module-info.java这个文件 ...

  7. 解决The package java.awt is not accessible或者javax.swing is not accessible的问题

    今天学习Java"图形界面的输入输出"时,用到了awt和swing包.但是eclipse一直报错: 解决方法如下:找到文件module.nito.java ,打开  输入" ...

  8. javax.swing super()方法

    super();这句的意思是调用父类的构造方法,只能写在子类的构造方法里面 super();必须是构造器的第一个语句,也就是只能在构造函数函数中间用,构造函数的特点是一和类名同名,二没有任何返回值类型 ...

  9. 解决jmeter控制台报javax.swing.text.BadLocationException: Position not represented by view的方法

    在 jmeter安装目录-bin目录下,修改jmeter.properties文件,添加以下两行内容: remote_hosts=127.0.0.1 server_port=1099 然后保存文件,重 ...

最新文章

  1. python接收输入的一行字符只统计数字的个数,Python(统计字符),python实例,输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数...
  2. 144显示器只有60_HKC IG27电竞显示器体验:27英寸+IPS+144Hz,千元平民价值不值?...
  3. 实战小技巧系列(4):WinForm简单步骤制作
  4. 分享10个强大的神器工具,你一定会需要!
  5. 周学习进度----03
  6. Tensorflow2.0开启,从此忘记1.*版本
  7. buidulbs android.jar,在将AS项目迁移到IDEA时,无法将com.android.bui...
  8. mysql简单增删改查(CRUD)
  9. pwm gpio android,关于占空比与PWM_以及GPIO背光开关
  10. 关闭迅雷首页播放视频的方法
  11. w25qxx SPI读取数据出来为全FF
  12. python实现屏幕截图_Python实现计算机屏幕任意区域截图
  13. IDEA:Push rejected 解决方式
  14. arcgis python实例_科学网—ArcGIS,Python,网络数据集中查询两点最短路径 - 余露的博文...
  15. Lecture 4 Microphone
  16. Clipper库 | 类型和填充规则
  17. ppi协议源码 c语言,西门子PPI通讯协议
  18. java微信消息发送消息_JAVA模拟微信消息发送请求
  19. html背景图去重,Python Django开发 经验技巧总结(二)
  20. vim注释的颜色修改 终端配色设定 vim自动跳转 大小写不敏感

热门文章

  1. Rust linux 系统接口使用
  2. suse linux用户界面,suse linux开户图形化界面
  3. 遇见BUG(2)去掉你的增量编译使能!
  4. 【ASP.NET Core】EF Core 模型与数据库的创建
  5. 1102: 火车票退票费计算(函数专题)
  6. 统计上报---日志上报成功率高的方式
  7. python3写unicode编码到文件
  8. 2.1 操作系统的类型与结构
  9. Linux系统的启动流程以及做个小小的Linux
  10. CentOS 6.5安全加固及性能优化