javax.swing.jFrame

Wesley13
• 阅读 646

原文地址: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.EAST
  • BorderLayout.WEST
  • BorderLayout.SOUTH
  • BorderLayout.NORTH
  • BorderLayout.CENTER

构造函数:

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. }

    

运行结果:

javax.swing.jFrame

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

[java] view plain copy

  1. f.setLayout(new BorderLayout(10,10));

运行结果:

javax.swing.jFrame


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. }

    

运行结果:

javax.swing.jFrame


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. }

    

运行结果:

javax.swing.jFrame


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. }

   

运行结果:

javax.swing.jFrame

将窗口变大后的效果:

javax.swing.jFrame


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. }

     

运行结果:

javax.swing.jFrame

按下Change按钮后的结果:

javax.swing.jFrame


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. }

     

运行结果:

javax.swing.jFrame

public static Component createHorizontalGlue()

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

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

[java] view plain copy

  1. box.add(Box.createHorizontalGlue());

    

运行结果:

javax.swing.jFrame

将窗口变大后的效果:

javax.swing.jFrame

public static Component createHorizontalStrut(int width)

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

将上例代码改成以下代码

[java] view plain copy

  1. box.add(Box.createHorizontalStrut(50));

运行结果:

javax.swing.jFrame

public static Component createRigidArea(Dimension d)

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

将上例代码改成以下代码

[java] view plain copy

  1. box.add(Box.createRigidArea(new Dimension(50,50)));

运行结果:

javax.swing.jFrame

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可以指定最大、较佳、最小的长宽大小。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
P2P技术揭秘.P2P网络技术原理与典型系统开发
Modular.Java(2009.06)\.Craig.Walls.文字版.pdf:http://www.t00y.com/file/59501950(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.t00y.com%2Ffile%2F59501950)\More.E
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这