一篇文章带你了解Java容器,面板及四大布局管理器应用

目录
  • 什么是容器?
  • 什么是面板?
  • JPanel面板
  • JScrollPane面板
  • 什么是布局管理器?
  • 绝对布局管理器
  • 流布局管理器
  • 边界布局管理
  • 网格布局管理器
  • 容器、面板、布局管理器之间的关系
  • 总结

什么是容器?

在Java的GUI界面设计中,关于容器的理解,从字面意思我们就可以认为它是存放控件的地方,而这个地方依托在窗体之上,常用的容器是container。

而关于container容器我们应该有这样的认识:Swing组件中的窗体通常是与容器相关联的,所以在一般情况下,建立完JFrame窗体后,我们会调用getContentPane()方法将窗体转换为容器,之后再在该容器中添加控件或布局管理器。关于控件在container容器中添加和删除用以下两种方法:

Container.add(); //为容器添加控件

Container.remove(); //为容器添加控件

实例程序如下:

public class ConJFrame extends JFrame{
	public ConJFrame() {
		setTitle("Container容器");
		setSize(400,400);
		Container container = getContentPane();		//将窗体变为容器
		/****************在容器中添加一个标签******************/
		JLabel jLabel = new JLabel("这是一个容器");
		jLabel.setBounds(100, 100, 200, 50);
		container.add(jLabel);	//将控件加入到容器
		/****************在容器中添加一个按钮后移除************/
		JButton jButton = new JButton("这是一个按钮");
		jButton.setBounds(100, 200, 200, 50);
		container.add(jButton);		//将按钮加入到容器
		container.remove(jButton);		//将按钮从容器中移除
		setLayout(null);	//清空布局管理器
		setVisible(true);	//设置窗体可见
		setLocationRelativeTo(null);	//设置窗体居中
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);	//设置窗体关闭方式
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new ConJFrame();
	}
}

效果如下:

什么是面板?

关于面板的解释,你可以认为它也是一个容器,但是这个容器必须添加在其他的容器中,在Swing中常用的面板有两种,分别是JPanel面板和JScrollPane面板,下面分别对这两种面板的用途进行介绍:

JPanel面板

在JPanel面板中我们可以添加一些组件来对该面板中的内容进行布局,之所以它具备这样的功能,是因为JPanel面板同样也继承了java.awt.Container类,因此它同样是具有Container容器的功能,

但是与Container容器不同的就是:Container容器不需要添加在其他容器中,而JPanel面板必须添加在其他容器中。

因此我们可以理解为JPanel面板其实就是对一个大的容器的划分,将Container容器根据一定的规则(布局管理)划分成了一个个小的面板。因此JPanel面板的使用一般是与布局管理器相结合的,

JScrollPane面板

先来看一种在界面设计时常见的问题:在一个较小的界面中显示一个较大的内容的情况,对于这种情况,我们常用的方法就是将较小的容器设置为JScrollPane面板,原因是因为JScrollPane面板是自带滚动条的,并且同时它也是一种容器,这也是在做相关开发时我们设置滚动条常用的一种方法。

使用JScrollPane面板时需要注意以下两个问题:

  • JScrollPane面板中只能布置一个控件,
  • JScrollPane面板不能使用布局管理器

因此如果想要在JScrollPane面板中显示多个控件,就需要首先将控件布局在JPanel面板中,之后将JPanel面板作为一个整体组件添加到JScrollPane面板中,

通过下面程序对JScrollPane面板进行实践:

以下程序是在JScrollPane面板中加入一个文本框,实现一个带有滚动条的文本框。

public class JScrollPaneClass extends JFrame{
	public JScrollPaneClass() {
		setTitle("JScrollPane面板");
		setSize(400,400);
		Container container = getContentPane();		//将窗体变为容器
		/****************在JScrollPane面板中添加一个文本框******************/
		JTextArea jTextArea = new JTextArea();
		JScrollPane jsp = new JScrollPane(jTextArea);
		container.add(jsp);		//将JScrollPane面板加入容器
		setVisible(true);	//设置窗体可见
		setLocationRelativeTo(null);	//设置窗体居中
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);	//设置窗体关闭方式
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new JScrollPaneClass();
	}
}

效果如下:

什么是布局管理器?

关于布局管理器,在Swing中,每个组件都有一个具体的位置和大小,而在容器中真正去摆放这些组件时其实是很难判断其具体位置和大小的,布局管理器就提供了一种对swing组件的排版方式,因此使用布局管理器就可以很有效的处理整个窗体中组件的布局方式,Swing提供的常用的布局管理器有四种:绝对布局管理器、流布局管理器、边界布局管理器、网格布局管理器,接下来会对这四种布局管理器进行探讨。

绝对布局管理器

除了网格布局管理器、流布局管理器、边界布局管理器这三种布局方式以外,还有一种较为不同的布局方式就是绝对布局,所谓绝对布局,就是按照一定的坐标数据将组件的坐标和大小硬性的设置在窗体上。

使用绝对布局时首先有一点需要注意:

就是要先取消默认布局管理器,方法为:

setLayout(null); //清空布局管理器,即取消原来的边界布局管理器

之后再使用以下方法对组件进行绝对定位:

setBounds(x,y,width,height);

//其中x表示组件基于容器左上角的横坐标、y表示纵坐标,width表示组件的宽,height表示组件的高

请看下面实例:在容器中采用绝对布局添加三个控件,并赋于横纵坐标和按钮的长宽:

public class AbsolutelyLayoutClass extends JFrame{
	public AbsolutelyLayoutClass() {
		setTitle("绝对布局管理器");
		setSize(600,300);
		Container container = getContentPane();		//将窗体变为容器
		/****************使用绝对布局管理器布局组件******************/
		JButton jb1 = new JButton("这是绝对布局1");
		jb1.setBounds(200, 50, 200, 30);	//为组件设置绝对坐标
		container.add(jb1);		//将组件添加到容器
		JButton jb2 = new JButton("这是绝对布局2");
		jb2.setBounds(200, 100, 200, 30);	//为组件设置绝对坐标
		container.add(jb2);	//将组件添加到容器
		JButton jb3 = new JButton("这是绝对布局3");
		jb3.setBounds(200, 150, 200, 30);	//为组件设置绝对坐标
		container.add(jb3);	//将组件添加到容器
		setLayout(null);	//清空布局管理器,即取消原来的边界布局管理器
		setVisible(true);	//设置窗体可见
		setLocationRelativeTo(null);	//设置窗体居中
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);	//设置窗体关闭方式
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new AbsolutelyLayoutClass();
	}
}

效果如下:

在使用绝对布局管理器时值得注意的就是:在使用绝对布局之前要调用setLayout(null)方法来告知编辑器,这里将不再使用默认的布局管理器。

流布局管理器

流布局管理器(FlowLayout)具有的特点就是:在其中的组件可以像“流”一样按照从左到右的顺序依次的排列,直到该行排列完毕后再从下一行继续排列。在默认的情况下,组将在流布局管理器中都是以居中排列的,当然排列的顺序是可以改变的,

FlowLayout类中的构造函数中有如下三种:

  • Public FlowLayout();
  • Public FlowLayout(int alignment);
  • Public FlowLayout(int alignment, int horizGap, int vertGap);

以上构造函数中的alignment参数表示组件在采用流布局管理器后在每一行的具体排放位置。可以赋的值为:

  • FlowLayout.LEFT = 0;
  • FlowLayout.CENTER = 1;
  • FlowLayout.RIGHT = 2;

以上三个值被赋予以后,表示组件在流布局管理器中每一行的摆放位置和摆放顺序,如当alignment=0时,流布局管理器中的组件按照从左到右的顺序排列,当alignment=1时,流布局管理器中的组件按照从中间向两端的顺序排列。

在Public FlowLayout(int alignment, int horizGap, int vertGap);构造方法中,后面的参数horizGap和vertGap分别表示以像素为单位指定组件之间的水平间隔和垂直间隔。

关于流布局管理器的具体使用可以参考如下实例:

在该窗体中按照流布局管理器添加10个按钮

public class FlowLayoutClass extends JFrame{
	public FlowLayoutClass() {
		setTitle("流布局管理器");
		setSize(600,300);
		Container container = getContentPane();		//将窗体变为容器
		/****************使用流布局管理器布局组件******************/
		//将容器设置为从左向右排列、组件水平间隔和垂直间隔分别为10的流布局管理器
		container.setLayout(new FlowLayout(0,10,10));
		for (int i = 0; i < 10; i++) {
			container.add(new JButton("流布局按钮" + i));
		}
		//setLayout(null);	//清空布局管理器,即取消原来的边界布局管理器
		setVisible(true);	//设置窗体可见
		setLocationRelativeTo(null);	//设置窗体居中
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);	//设置窗体关闭方式
	}
	public static void main(String[] args) {
		new FlowLayoutClass();
	}
}

效果如下:

在我们拉动窗体大小变化时,其中的组件也会按照流布局的特点发生改变,这就验证了流布局管理器中的组件按照从左到右的顺序依次摆放,直到该行占满后再从下一行开始摆放。

边界布局管理

在默认不指定窗体布局的情况下,Swing组件的布局模式就是边界布局(BorderLayout),该布局管理器的特征就是组件会按照一定要求布满整个容器的边界,

边界布局管理器可以将容器划分成东、南、西、北、中五个区域,在容器中添加组件时,我们可以设置组将放入到哪一个区域中,关于区域的控制可以使用BorderLayout类中的成员方法来确定,关于这些成员变量的具体含义可以参考下表:


成员变量


含义


BorderLayout.NORTH


在容器中添加组件时,组件置于顶端


BorderLayout.SOUTH


在容器中添加组件时,组件置于底端


BorderLayout.EAST


在容器中添加组件时,组件置于右端


BorderLayout.WEST


在容器中添加组件时,组件置于左端


BorderLayout.CENTER


在容器中添加组件时,组件置于中间开始填充,直到与其他组件边界连接

关于边界布局管理器的具体使用可以参考如下实例,将容器划分为东、南、西、北、中五个区域,并在各区域中添加组件。

public class BorderLayoutClass extends JFrame{
	public BorderLayoutClass() {
		setTitle("边界布局管理器");
		setSize(600,300);
		Container container = getContentPane();		//将窗体变为容器
		/****************使用边界布局管理器布局组件******************/
		//将容器设置为边界布局管理器
		container.setLayout(new BorderLayout());
		container.add(new JButton("我是北部区域"),BorderLayout.NORTH);	//将按钮加入到北部区域
		container.add(new JButton("我是西部区域"),BorderLayout.WEST);		//将按钮加入到西部区域
		container.add(new JButton("我是中部区域"),BorderLayout.CENTER);	//将按钮加入到中部区域
		container.add(new JButton("我是东部区域"),BorderLayout.EAST);		//将按钮加入到东部区域
		container.add(new JButton("我是南部区域"),BorderLayout.SOUTH);	//将按钮加入到南部区域
		//setLayout(null);	//清空布局管理器,即取消原来的边界布局管理器
		setVisible(true);	//设置窗体可见
		setLocationRelativeTo(null);	//设置窗体居中
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);	//设置窗体关闭方式
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new BorderLayoutClass();
	}
}

效果如下:

在该方法中直接在add()方法中新建组件,并且在后方加入表示组件位置的参数。

网格布局管理器

网格布局管理器(GridLayout)从字面意思就可以理解,就是将容器按照行列划分成特定的网格,在网格布局管理器中每一个网格的大小都是一样的,并且网格中格子的个数是由划分的行和列决定的,如一个两行两列的网格布局,将会划分成四个大小相同的网格。

在网格布局中的组将会按照从左到右、从上到下的顺序加入到网格中,而且加入到网格中的组件都会将网格填满,同时改变窗体的大小,网格的大小也会随之改变。

网格布局中常用的布局管理器有如下两种:

  • Public GridLayout(int rows, int columns);
  • Public GridLayout(int rows, int columns, int horizGap, int vertGap);

其中的rows和columns分别表示网格布局的行和列,这两个参数中只有一个可以为0,表示为一行或一列可以摆放多个组件,horizGap和vertGap两个参数和流布局管理器中的一样,只不过在流布局管理器中表示的是组件之间的水平和垂直间距,而在网格布局管理器中表示网格之间的水平和垂直间距,

关于网格布局管理器的具体使用参考如下实例,

将容器设置为4行5列的网格,网格之间的水平和垂直间距为10像素。并在其中加入20个按钮

public class GridLayoutClass extends JFrame{
	public GridLayoutClass() {
		setTitle("网格布局管理器");
		setSize(600,300);
		Container container = getContentPane();		//将窗体变为容器
		/****************使用网格布局管理器布局组件******************/
		//将容器设置为4行5列网格布局管理器,网格之间的水平和垂直间距都为10像素
		container.setLayout(new GridLayout(4,5,10,10));
		for (int i = 0; i < 20; i++) {
			container.add(new JButton("网格" + i));
		}
		//setLayout(null);	//清空布局管理器,即取消原来的边界布局管理器
		setVisible(true);	//设置窗体可见
		setLocationRelativeTo(null);	//设置窗体居中
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);	//设置窗体关闭方式
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new GridLayoutClass();
	}
}

效果如下

在拉动窗体改变大小时,网格的大小也会随之改变。

容器、面板、布局管理器之间的关系

关于Swing窗体开发中的容器、面板、布局管理器之间有如下的关系:

  • 面板应该设置在容器之中,
  • 布局管理器可以设置在容器或面板之中,
  • 布局管理器中还可以嵌套面板,在该面板中还可以再添加布局管理器,
  • 只有深刻的理解了这三者之间的关系,才能在窗体开发中很好的结合使用。

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Java使用elasticsearch基础API使用案例讲解

    1.依赖 我用的是 springboot 2.2.5.RELEASE 版本,这里只贴出主要依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> 2.配置+测试源码 这里根据elasticsearch服务端的地址进行

  • 一篇文章带你入门Java封装

    目录 什么是封装 如何实现封装 代码展示 构造方法 注意点: 代码展示 总结 封装的优点 什么是封装 Java中的封装是将数据(变量)和作用于数据(方法)的代码作为一个单元包装在一起的机制. 在封装中,类的变量将从其他类隐藏,并且只能通过当前类的方法访问. 如何实现封装 可以分为两步: 第一步:将类的变量声明为private. 第二步:提供公共set和get方法来修改和获取变量的值. 代码展示 public class User { private String name; private in

  • 一篇文章带你入门Java继承

    目录 Java中继承 什么是继承: 为什么要用继承: 学习总结: 继承关键字:extends 总结 Java中继承 什么是继承: 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为. 为什么要用继承: 可以去掉重复代码,方便后期维护 举个列子,大家应该都玩过英雄联盟,每个英雄都是一个类,如果说不用继承的话每次都要重复定义每个英雄的成员属性,如下图我举了一个MF,一个EZ的列子 public class MissFortu

  • Java实现SMS短信通发送手机验证码案例讲解

    注册网建短信通账号 链接:http://sms.webchinese.cn/ 设置短信签名 注意不要乱写别的公司等,会被视为诈骗信息 设置短信密钥,发送时代替密码 Java方式实现 导入依赖 commons-httpclient-3.1.jar 编写SmsUtil工具类 import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.NameValuePair; import org.ap

  • Java拦截器Interceptor和过滤器Filte的执行顺序和区别

    目录 1.实现原理不同 2.使用范围不同 3.触发时机不同 4.拦截的请求范围不同 5.注入Bean情况不同 6.控制执行顺序不同 1.实现原理不同 过滤器和拦截器 底层实现方式大不相同,过滤器 是基于函数回调的,拦截器 则是基于Java的反射机制(动态代理)实现的. 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用 4.拦截器可以访问

  • Java虚拟机类加载器之双亲委派机制模型案例

    1. 双亲委派模型是什么? 当某个类加载器需要加载某个.class字节码文件时,它首先把这个任务委托给它的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类. 2. 双亲委派模型的工作原理? 1.如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去执行: 2.如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器:(每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶

  • 一篇文章带你了解Java容器,面板及四大布局管理器应用

    目录 什么是容器? 什么是面板? JPanel面板 JScrollPane面板 什么是布局管理器? 绝对布局管理器 流布局管理器 边界布局管理 网格布局管理器 容器.面板.布局管理器之间的关系 总结 什么是容器? 在Java的GUI界面设计中,关于容器的理解,从字面意思我们就可以认为它是存放控件的地方,而这个地方依托在窗体之上,常用的容器是container. 而关于container容器我们应该有这样的认识:Swing组件中的窗体通常是与容器相关联的,所以在一般情况下,建立完JFrame窗体后

  • 一篇文章带你了解Java Spring基础与IOC

    目录 About Spring About IOC Hello Spring Hello.java Beans.xml Test.java IOC创建对象的几种方式 Spring import settings Dependency Injection 1.构造器注入 2.set注入 3.拓展注入 P-namespcae&C-namespace Bean scopes singleton prototype Bean的自动装配 byName autowire byType autowire 小结

  • 一篇文章带你了解Java中ThreadPool线程池

    目录 ThreadPool 线程池的优势 线程池的特点 1 线程池的方法 (1) newFixedThreadPool (2) newSingleThreadExecutor (3) newScheduledThreadPool (4) newCachedThreadPool 2 线程池底层原理 3 线程池策略及分析 拒绝策略 如何设置maximumPoolSize大小 ThreadPool 线程池的优势 线程池做的工作主要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些

  • 一篇文章带你了解JAVA面对对象应用

    目录 常用API String类 关于String为啥不可改变 StringBuilder类 String.StringBuffer 和 StringBuilder 的区别: ArrayList 1.1ArrayList类概述 1.2ArrayList类常用方法 学生管理系统 总结 常用API API理解 什么是API API (Application Programming Interface) :应用程序编程接口 java中的API 指的就是 JDK 中提供的各种功能的 Java类,这些类将

  • 一篇文章带你入门java集合

    目录 一.简介 1.java集合框架图 2.集合框架体系 3.Set和List的区别 二.ArrayList 1.定义 2.用实例了解ArrayList 三.LinkedList 1.语法 2.示例 四.HashSet 1.定义 2.语法 3.示例 五.HashMap 1.定义 2.语法 3.示例 Java HashMap 方法 六.Iterator(迭代器) 1.定义 2.示例 七.List和数组互转 总结 一.简介 1.java集合框架图 从上面的集合框架图可以看到,Java 集合框架主要包

  • 一篇文章带你入门java面向对象

    目录 一.继承 示例: 二.重载 三.接口 1.接口与类相似点: 2.接口与类的区别: 3.语法 四.枚举 1.定义 2.迭代枚举元素 3.在 switch 中使用枚举类 总结 一.继承 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为 本章就以人.学生.老师作为例子.学生和老师都继承人这个对象,都有人的特征和行为,人就是父类,老师和学生就是子类 示例: 人类: package com.zhouzy.base.t7;

  • 一篇文章带你入门Java修饰符

    目录 定义 分类 访问控制修饰符 非访问控制修饰符 修饰符的使用说明 修饰类 修饰方法 访问控制修饰符 非访问控制修饰符 修饰变量 总结 定义 Java修饰符:修饰符用来定义类.方法或者变量,通常放在语句的最前端. 分类 主要分为2类: 访问控制修饰符 非访问控制修饰符 访问控制修饰符 可以使用访问控制符来保护对类.变量.方法和构造方法的访问.分为以下4中权限:private,default,protected,public. 权限说明: 修饰符 当前类 同包 子类(不同包) 不同包(其他类)

  • 一篇文章带你了解JAVA面对对象之继承与修饰符

    目录 Java面向对象之继承与修饰符 继承 1.含义 2.实现 3.好处 4.短处 5.成员变量的访问特点 7.继承中结构方法的访问特点 8.方法重写 9.java继承的注意事项 修饰符 1.package 2.import 3.权限修饰符 4.final 5.ianl修饰基本数据类型变量 6.final修饰引用数据类型变量 7.static 8.static访问的特点 总结 Java面向对象之继承与修饰符 继承 1.含义 继承是面向对象三大特征之一,能使子类具有父类的属性和方法,还可以在子类中

  • 一篇文章带你了解Java之关键字和保留字

    目录 引言 概念 关键字分类 1.访问控制 2.类.方法和变量修饰符 3.程序控制语句 4.错误处理 5包相关 6.基本类型 7.变量引用 8.保留关键字 9.其他(个人认为不是关键字.也不是保留字,但是,如果尝试将它们用作Java中的标识符,仍然会生成编译时错误.) 总结 引言 ♀ 小AD:小明哥,前几天边学Java边学连招,我感觉上分如喝水,我这连招很熟练哦. ♂ 明世隐:跟明哥混,舒服吧! ♀ 小AD:舒服啊,回头请你喝奶茶! ♂ 明世隐:乖,懂事! ♀ 小AD:那今天整点啥? ♂ 明世隐

  • 一篇文章带你入门Java字面量和常量

    目录 引言 概念 字面量 字面量的分类 常量 总结 引言 ♀ 小AD:哥,前两天我没有闪现到刺客脸上了吧 ♂ 明世隐:在这方面做的有进步. ♀ 小AD:明哥教的好,通过学习Java关键字,游戏水平也得到了提升,一举两得,舒服. ♂ 明世隐:可是你看到残血还是上头啊,是了多少次,你说? ♀ 小AD:5.6次吧 ♂ 明世隐:岂止5.6,起码10次. ♀ 小AD:这不是看到200金币,经不住诱惑吗 ♂ 明世隐:关爱残血,你学哪里去了,游戏中就不能多一些人间的关爱吗?你就不能关爱一下放暑假的小弟弟小妹妹

随机推荐