Java页面布局

news2025/1/18 12:00:07

Java页面常用的布局主要有五种:FlowLayout、BorderLayout、GridLayout、CardLayout和NULL

1、FlowLayout

称为“流布局”,将组件按从左到右顺序、流动的安排到容器中,直到占满上方的空间时、则向下移动一行,Flow Layout是面板的默认布局

Flow Layout的构造方法列表
方法功能说明
Flow Layout()中间对齐,默认间距为5像素
Flow Layout(int align)指定对齐方式,默认间距为5像素
Flow Layout(int align,int hgap,int vgap)指定对齐方式、水平和垂直间距

比如下面这段代码,默认情况是居中对齐,水平和垂直间距为5个像素

package javase;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class test {
	JFrame frame=new JFrame("test");//创建一个新的、不可见的、名为test的窗体
	JButton btn1=new JButton("button1");
	JButton btn2=new JButton("button2");
	JButton btn3=new JButton("button3");
	JButton btn4=new JButton("button4");
	public test() {
		frame.setLayout(new FlowLayout());//设置窗口的布局管理器
		frame.setSize(300,200);//设置窗口的大小
		frame.setLocation(300, 100);
		frame.add(btn1);
		frame.add(btn2);
		frame.add(btn3);
		frame.add(btn4);
		frame.setVisible(true);//设置窗口可见
	}
	public static void main(String[] args) {
		EventQueue.invokeLater(()->{//当GUI越来越大的时候可以避免线程之间发生错误
	new test();
		});
	}

}

运行结果如下:

给它添加参数后,比如添加左对齐,水平10个像素,垂直15个像素,效果如下

	frame.setLayout(new FlowLayout(FlowLayout.LEFT,10,15));

注意:采用流布局,当改变窗体的大小时,可以发现各组件的位置随着窗体的变化而变化,而各组件的大小不变,保持原来的“最合适”大小。

 2、Border Layout

称为“边界布局”,它允许将组件有选择的放置到容器的中部、北部、南部、东部或西部,它是窗体框架的默认布局。

Border Layout的构造方法列表
方法功能说明
Border Layout()新的、无间距
Border Layout(int hgap,int vgap)新的、指定水平、垂直间距

如下面这段代码

package javase;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class test {
	JFrame frame=new JFrame("test");//创建一个新的、不可见的、名为test的窗体
	JButton btn1=new JButton("button1");
	JButton btn2=new JButton("button2");
	JButton btn3=new JButton("button3");
	JButton btn4=new JButton("button4");
	JButton btn5=new JButton("button5");
	public test() {
		frame.setLayout(new BorderLayout());//设置窗口的布局管理器
		frame.setSize(300,200);//设置窗口的大小
		frame.setLocation(300, 100);
		frame.add(btn1,BorderLayout.WEST);
		frame.add(btn2,BorderLayout.EAST);
		frame.add(btn3,BorderLayout.NORTH);
		frame.add(btn4,BorderLayout.SOUTH);
		frame.add(btn5,BorderLayout.CENTER);
		frame.setVisible(true);//设置窗口可见
	}
	public static void main(String[] args) {
		EventQueue.invokeLater(()->{//当GUI越来越大的时候可以避免线程之间发生错误
	new test();
		});
	}

}

 

增加水平和垂直间距后效果如下

frame.setLayout(new BorderLayout(4,4));

 注意:采用边界布局,当改变窗体的大小时,可以发现东南西北四个位置的组件长度进行拉伸,而中间位置的组件进行扩展

3、Grid Layout

称为“网格布局”,它像表格一样,按行和列排列所有组件,且每个单元格大小都一样,在向表格里面添加组件的时候,他们将按照从左到右、从上到下的顺序加入

Grid Layout的构造方法列表
方法功能说明
Grid Layout(int rows,int cols)新的、指定行数和列数
Grid Layout(int rows,int cols,int hgap,int vgap)新的、指定行数和列数、水平和垂直间距

比如下面这个计算器的页面布局,输入框位于窗口的北方,其余按钮放在一个容器中置于窗口的中央,容器的布局就是网格布局

package javase;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class test {
	JFrame frame=new JFrame("test");//创建一个新的、不可见的、名为test的窗体
	String name[]= {"7","8","9","+","4","5","6","-","1","2","3","*","0",".","=","/"};
	JPanel panel=new JPanel(new GridLayout(4,4));
	JTextField f=new JTextField(20);
	JButton but[]=new JButton[name.length];
	public test() {
		frame.setLayout(new BorderLayout(4,4));//设置窗口的布局管理器
		frame.setSize(500,300);//设置窗口的大小
		frame.setLocation(300, 100);
		frame.add(f,BorderLayout.NORTH);
		for(int i=0;i<but.length;i++) {
			but[i]=new JButton(name[i]);
			panel.add(but[i]);
		}
		frame.add(panel,BorderLayout.CENTER);
		frame.setVisible(true);//设置窗口可见
	}
	public static void main(String[] args) {
		EventQueue.invokeLater(()->{//当GUI越来越大的时候可以避免线程之间发生错误
	new test();
		});
	}

}

效果如下:

 

 4、Card Layout

称为卡片布局,它将加入到容器的组件看成一叠卡片,只能看到最上面的组件,通过调用一些方法才能看到其他的组件

Card Layout的方法列表
方法功能说明
CardLayout()默认间距为0的新卡片布局
Card Layout(int hgap,int vgap)指定水平和垂直间距的新卡片布局
frist(Container parent)显示第一张卡片
last(Container parent)显示最后一张卡片
previous(Container parent)显示当前卡片的上一张卡片
next(Container parent)显示当前卡片的下一张卡片
show(Container parent)显示指定名片的卡片

package javase;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class test {
	JFrame frame=new JFrame("test");//创建一个新的、不可见的、名为test的窗体
	JButton but1=new JButton("button1");
	JButton but2=new JButton("button2");
	JButton but3=new JButton("button3");
	JButton but4=new JButton("button4");
	CardLayout c=new CardLayout();
	JPanel panel=new JPanel(c);
	public test() {
		frame.setSize(500,300);//设置窗口的大小
		frame.setLocation(300, 100);
		panel.add("1",but1);
		panel.add("2",but2);
		panel.add("3",but3);
		panel.add("4",but4);
		frame.add(panel);
	//	c.last(panel);   //显示最后一张卡片,即button4
	//	c.show(panel, "2");  //显示名称是2的卡片,显示结果是button2
		frame.setVisible(true);//设置窗口可见
	}
	public static void main(String[] args) {
		EventQueue.invokeLater(()->{//当GUI越来越大的时候可以避免线程之间发生错误
	new test();
		});
	}

}

这段代码显示的是button1,结果如下

 注意:采用卡片布局,当改变窗口大小时,可以发现卡片上的组件大小随着窗体的变化而变化,并始终占满整个窗口。

5、NULL布局

在实际开发过程中,用户界面比较复杂,使用Flow Layout、Border Layout、Grid Layout和Card Layout这些布局难以满足,这时可以采用NULL布局,即容器不采用任何布局,而是通过设置每个组件在容器中的位置及大小来安排

使用NULL布局的步骤如下:

(1)设置容器的布局为空

panel.setLayout(null);

(2)设置组件的位置及大小

		label1.setBounds(0,0,300,30);
		label2.setBounds(50, 50, 50, 30);
		f1.setBounds(100, 50, 100, 30);
		label3.setBounds(50,100,50,30);
		f2.setBounds(100, 100, 100, 30);

(3)将组件添加到容器中

		panel.add(label1);
		panel.add(label2);
		panel.add(label3);
		panel.add(f1);
		panel.add(f2);
		frame.add(panel);

比如下面这个登录界面

代码: 

package javase;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class test {
	JFrame frame=new JFrame("test");//创建一个新的、不可见的、名为test的窗体
	JLabel label1=new JLabel("登录界面",JLabel.CENTER);
	JLabel label2=new JLabel("用户名");
	JLabel label3=new JLabel("密码");
	JTextField f1=new JTextField();
	JTextField f2=new JTextField();
	JPanel panel=new JPanel();
	public test() {
		panel.setLayout(null);
		frame.setSize(300,300);//设置窗口的大小
		frame.setLocation(300, 100);
		label1.setBounds(0,0,300,30);
		label2.setBounds(50, 50, 50, 30);
		f1.setBounds(100, 50, 100, 30);
		label3.setBounds(50,100,50,30);
		f2.setBounds(100, 100, 100, 30);
		panel.add(label1);
		panel.add(label2);
		panel.add(label3);
		panel.add(f1);
		panel.add(f2);
		frame.add(panel);
		frame.setVisible(true);//设置窗口可见
	}
	public static void main(String[] args) {
		EventQueue.invokeLater(()->{//当GUI越来越大的时候可以避免线程之间发生错误
	new test();
		});
	}

}

NULL布局一般用于组件之间位置相对固定,并且窗口不允许随便变换大小的情况,否则当窗口大小发生变化时,因所有组件使用绝对位置,会产生组件整体“偏移”的情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/500862.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

13.多线程

1.实现多线程 1.1简单了解多线程【理解】 是指从软件或者硬件上实现多个线程并发执行的技术。 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程&#xff0c;提升性能。 1.2并发和并行【理解】 并行&#xff1a;在同一时刻&#xff0c;有多个指令在多个CPU上…

Packet Tracer - 配置 IPv6 ACL

Packet Tracer - 配置 IPv6 ACL 拓扑图 地址分配表 设备 接口 IPv6 地址/前缀 默认网关 服务器 3 NIC 2001:DB8:1:30::30/64 FE80::30 目标 第 1 部分&#xff1a;配置、应用并验证一个 IPv6 ACL 第 2 部分&#xff1a;配置、应用并验证第二个 IPv6 ACL 第 1 部分…

node.js+vue鲜花销售网站

后台模块设计&#xff1a; ①用户管理功能。管理员在后台首页点击用户管理就会进入用户列表页面&#xff0c;系统会将数据库中的用户信息以列表的形式显示出来&#xff0c;管理员可以在这个页面进行用户的更新和删除操作&#xff0c;系统可以将最新更新的信息重新写入用户表中并…

Chrome浏览器更新字体看不清的最终解决方案

阿酷TONY / 2023-5-6 / 长沙 / 原创 / 实测解决 Chrome更新至版本Chrome 109.0.5414.120 字体看不清 浏览器症状&#xff1a;Chrome更新至版本Chrome 109.0.5414.120 字体看不清&#xff1b;会很细&#xff0c;在设置中选择自定义的字体&#xff0c;仍无法解决&#xff1b;…

当因果推理遇上时间序列,会碰撞出怎样的火花?

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 近年来因果推理和时间序列已经成为了数据科学领域备受瞩目的研究方向。因果推理可以帮助我们识别变量之间的因果关系&#xff0c;时间序列分析则可以便于我们理解变量随时间变化的规律。这两个方向都可以为我们…

javaScript---设计模式-封装与对象

目录 1、封装对象时的设计模式 2、基本结构与应用示例 2.1 工厂模式 2.2 建造者模式 2.3 单例模式 封装的目的&#xff1a;①定义变量不会污染外部&#xff1b;②能作为一个模块调用&#xff1b;③遵循开闭原则。 好的封装&#xff08;不可见、留接口&#xff09;&#xff1a;①…

Cacti 前台命令注入漏洞

文章目录 文档说明漏洞描述影响版本漏洞原理命令执行简单分析客户端ip伪造分析 漏洞复现下载vulhub启动环境配置攻击 复现总结修复方案原创申明 文档说明 本文作者:SwBack 创作时间:2023/4/8 0:12 知乎:https://www.zhihu.com/people/back-88-87 CSDN:https://blog.csdn.net/q…

solidity--语言基础

solidity源文件结构 // SPDX-License-Identifier: MIT pragma solidity ^0.5.2; pragma abicoder v1; import "filename"; 注释 智能合约组成 状态变量 // SPDX-License-Identifier: GPL-3.0 pragma solidity >0.4.0 <0.9.0;contract SimpleStorage {uint stor…

SD卡打不开是怎么回事?SD卡打不开里面数据怎样恢复

SD卡已经成为了移动设备和数码相机中受欢迎的存储选项之一。但是使用过程中难免会遇到一些问题&#xff0c;例如SD卡突然打不开了&#xff0c;并且无法访问其中的数据。这种情况常常让人感到烦恼和无助。但是不要紧张&#xff0c;下面我们将介绍SD卡打不开里面数据怎样恢复的方…

Yuzuki Lizard V851S开发板 –编译 OPENCV 4.5.4

1.主要参考教程地址&#xff0c;实际操作结合多个教程。 https://blog.csdn.net/Flag_ing/article/details/109508374 2.放从OPENCV RELEASE 下载的解压出来的文件&#xff0c;里面还要放对应版本的contribute 解压文件 /root/opencv-4.5.4/root/opencv-4.5.4/build6在这里要…

深入理解Java虚拟机——内存分配与回收策略

1.前言 在读这篇博客之前&#xff0c;你需要了解分代收集理论中&#xff0c;收集器应该将Java堆划分出不同的区域**&#xff0c;**然后将回收对象依据其年龄&#xff08;年龄即对象熬过垃圾收集过程的次数&#xff09;分配到不同的区域之中存储。 例如appel式回收&#xff0c…

SSM整合详细教学(上)

SSM整合详细教学&#xff08;上&#xff09; 一、SSM整合1. SSM整合配置1.1 SSM整合流程1.2 SSM整合配置1.2.1 创建工程&#xff0c;添加依赖和插件1.2.2 Spring整合Mybatis1.2.3 Spring整合SpringMVC 2. 功能模块开发2.1 数据层开发(BookDao)2.2 业务层开发(BookService/BookS…

java注解,一篇文章就够了

开篇一张图 一、定义 注解是一种标记&#xff0c;使类或接口附加额外信息&#xff0c;帮助编译器和 JVM 完成一些特定功能。 Annotation(注解)也被称为元数据(Metadata)是JDK1.5及以后版本引入的&#xff0c;用于修饰包、类、接口、字段、方法参数、局部变量等。 如&#xf…

iOS与Android应用开发的对比:如何选择最佳开发平台?

第一章&#xff1a;引言 在移动应用开发领域&#xff0c;iOS和Android是最为流行的操作系统。选择最佳的开发平台可以使开发人员更有效地开发和发布应用程序。本文将分析iOS和Android应用开发的优缺点&#xff0c;并提供一些有关如何选择最佳开发平台的建议。 第二章&#xf…

【Git基础】常用git命令(四)

文章目录 1. 处理突发事件1.1 暂存修改1.2 git stash的一些命令 2. 指定不需要git管理的文件2.1 指定不需要git管理的文件2.2 .gitignore的规则 3. 如何解决项目之间的依赖3.1 如何使用git处理项目之间的依赖3.2 submodule的使用方式3.3 如何clone submodule3.4 submodule的陷阱…

小白如何做好项目管理?看这里

做好项目管理不是一件容易的事儿&#xff0c;只有掌握了正确的技巧&#xff0c;才能事半功倍地完成项目。 下面就按照项目管理的流程来讲一讲如何做好项目管理。 项目管理是指运用系统的理论方法&#xff0c;在有限的条件和资源下&#xff0c;对项目从开始到结束的全流程进行计…

电子会议桌牌系统——基站版

一、产品特点 低功耗&#xff0c;常规使用3-5年电池寿命 支持空中唤醒&#xff0c;刷新快速&#xff0c;几秒钟内看到结果 点阵电子纸屏幕&#xff0c;视角接近180 基于Web的应用界面&#xff0c;支持跨平台操作 安装简单&#xff0c;快速布置 电池供电不需要布线 双面显…

【react从入门到精通】React兄弟组件通信方式详解(有示例)

文章目录 前言React技能树通过共同的父组件传递props使用React Context使用Redux使用EventBus写在最后 前言 在上一篇文章《React父子组件通信方式详解》中我们了解了React父子组件通信的4中方式。 本文中我们将详细了解react兄弟组件通信方式。 React技能树 React 技能树 ├…

如何利用分钟级降水预报 API 优化城市水利管理?

引言 降水预报对于城市水利管理部门来说至关重要&#xff0c;它可以帮助管理者及时了解当地的降雨情况&#xff0c;以便更好地管理城市水利设施&#xff0c;保障公共安全。然而&#xff0c;传统的降水预报数据一般只提供每小时或每3小时的粗略预报数据&#xff0c;无法满足城市…

服务部分综合实验

#每台机子关闭防火墙和selinux ##NFS test1 10 ##部署共享存储 test1 10 systemctl stop firewalld systemctl disable firewalld setenforce 0 cd /opt/ mkdir nfs cd nfs/ mkdir web1 web2 echo "this is web1" > web1/index.html echo "this is web2&quo…