JAVA SWING之JFrame和JPanel布局-程序员宅基地

技术标签: JAVA  java  后端  开发语言  

初学JAVA的时候学习过SWING,每次写程序就直接复制Jframe和Jpanel设置,再调一下大小(不知道有没有人跟我一样),到现在也不清楚它们有什么关系,才回顾学习。Swing虽然是很老的技术了,但也有很多工具是Swing写的例如JetBrains系列,最常用的IDEA。开发一下小工具还是不错的。掌握整体布局后,再去写代码和添加组件就很简单了。

一、JFrame窗口

1.什么是JFrame
JFrame 用来设计类似于 Windows 系统中窗口形式的界面。JFrame 是 Swing 组件的顶层容器,该类继承了 AWT 的 Frame 类,支持 Swing 体系结构的高级 GUI 属性。

2.如何使用JFrame
当我们创建一个类的时候需要继承JFrame类,才可继续调用方法。在继承类中即使不初始化JFrame也可直接调用 JFrame 类的方法。创建了窗体后不能直接将其它组件放到窗体中,必须创建一个容器实例化对象才能放入内容窗格中。如图
在这里插入图片描述
常用方法
在这里插入图片描述

如下一个简单的窗口

public class Test extends JFrame{
    
	public Test() {
    
		    setTitle("Java 第一个 GUI 程序");    //设置显示窗口标题
	        setSize(400,200);    //设置窗口显示尺寸
	        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    //置窗口是否可以关闭,关闭窗口后程序将一起关闭
	        JLabel l=new JLabel("这是使用JFrame类创建的窗口");    //创建一个标签
	        getContentPane().add(l);    //将标签组件添加到内容窗格上
	        setVisible(true);    //设置窗口是否可见
	}
	public static void main(String[] args) {
    
		new Test();
	}
}

在这里插入图片描述

二、JPanel面板

1.什么是JPanel:
JPanel 是一种中间层容器,它能容纳组件并将组件组合在一起,但它本身必须添加到其他容器中使用。JPanel 类的构造方法如下。上述contentPane实际上就是一个JPanel。Jframe中会默认new一个JPanel,塞入JFrame中。有一个很形象的比喻,JFrame是一个桌子,各个组件是一盘盘菜,而JPanel就是一个菜盘,装了各个组件以后放到桌上。一个JFrame界面上可以有多个JPanel用来划分不同的区域。

2.如何使用JPanel:
常用方法:
在这里插入图片描述
此处写了两个JPanel示例代码如下:

public class Test extends JFrame{
    
	public Test() {
    
		    setTitle("Java 第二个 GUI 程序");    //设置显示窗口标题
	        setBounds(100,100,400,341);    //设置窗口显示位置及尺寸
	        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	        setVisible(true);    //设置窗口是否可见
	        getContentPane().setLayout(null);//设置空布局,组件想怎么放怎么放
	        
	        JPanel panel = new JPanel();//第一个JPanel
	        panel.setBorder(new LineBorder(Color.CYAN));
	        panel.setBounds(10, 10, 364, 98);
	        panel.add(new Label("first"));//将标签放入面板中
	        getContentPane().add(panel);//将panel放入jframe界面
	        
	        JPanel panel_1 = new JPanel();//第二个JPanel
	        panel_1.setBorder(new LineBorder(Color.PINK));
	        panel_1.setBounds(10, 141, 364, 128);
	        panel_1.add(new Label("second"));//这是第二个面板
	        getContentPane().add(panel_1);//将panel放入jframe界面	        
	}
	public static void main(String[] args) {
    
		new Test();
	}
}

在这里插入图片描述

三、SWING布局管理

上述第二个例子中没有采用布局方法,所以想怎么放panel就怎么放,实际swing中有很多布局方法,可以直接使用。
1.边框布局方式
边框布局管理器(BorderLayout)将窗口分为 5 个区域:North、South、East、West 和 Center。其中,North 表示北,将占据面板的上方;Soufe 表示南,将占据面板的下方;East表示东,将占据面板的右侧;West 表示西,将占据面板的左侧;中间区域 Center 是在东、南、西、北都填满后剩下的区域,如图所示:
在这里插入图片描述
示例代码如下:

public class Test extends JFrame{
    
	public Test() {
    
		    setTitle("Java 第二个 GUI 程序");    //设置显示窗口标题
	        setBounds(100,100,400,341);    //设置窗口显示位置及尺寸
	        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	        getContentPane().setLayout(new BorderLayout());//设置边框布局
	        //如果想设置横纵向间隔使用方法BorderLayout(int hgap,int vgap)
	        JButton button1=new JButton ("上");
	        JButton button2=new JButton("左");
	        JButton button3=new JButton("中");
	        JButton button4=new JButton("右");
	        JButton button5=new JButton("下");
	        getContentPane().add(button1,BorderLayout.NORTH);
	        getContentPane().add(button2,BorderLayout.WEST);
	        getContentPane().add(button3,BorderLayout.CENTER);
	        getContentPane().add(button4,BorderLayout.EAST);
	        getContentPane().add(button5,BorderLayout.SOUTH);
	        setVisible(true);    //设置窗口是否可见,注意,一般这个放最后面更合适
	}
	public static void main(String[] args) {
    
		new Test();
	}
}

效果图如图:
在这里插入图片描述
如果缺失四个方向任何一方,会由中间部分去补充区域

2.流式布局方式
FlowLayout(流式布局管理器)是 JPanel 和 JApplet 的默认布局管理器。FlowLayout 会将组件按照从上到下、从左到右的放置规律逐行进行定位。与其他布局管理器不同的是,FlowLayout 布局管理器不限制它所管理组件的大小,而是允许它们有自己的最佳大小。
示例代码:

public class Test extends JFrame{
    
	public Test() {
    
		    setTitle("Java 第二个 GUI 程序");    //设置显示窗口标题
	        setBounds(100,100,400,341);    //设置窗口显示位置及尺寸
	        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	        JPanel jPanel=new JPanel();    //创建面板
	        JButton btn1=new JButton("1");    //创建按钮
	        JButton btn2=new JButton("2");
	        JButton btn3=new JButton("3");
	        JButton btn4=new JButton("4");
	        JButton btn5=new JButton("5");
	        JButton btn6=new JButton("6");
	        JButton btn7=new JButton("7");
	        JButton btn8=new JButton("8");
	        JButton btn9=new JButton("9");
	        jPanel.add(btn1);    //面板中添加按钮
	        jPanel.add(btn2);
	        jPanel.add(btn3);
	        jPanel.add(btn4);
	        jPanel.add(btn5);
	        jPanel.add(btn6);
	        jPanel.add(btn7);
	        jPanel.add(btn8);
	        jPanel.add(btn9);
	        //向JPanel添加FlowLayout布局管理器,将组件间的横向和纵向间隙都设置为20像素
	        //FlowLayout(int align, int hgap,int vgap)组件对齐方式以及横纵隔距离
	        jPanel.setLayout(new FlowLayout(FlowLayout.LEADING,20,20));
	        jPanel.setBackground(Color.blue);    //设置背景色
	        add(jPanel);
	        setVisible(true);    //设置窗口是否可见,注意,一般这个放最后面更合适
	}
	public static void main(String[] args) {
    
		new Test();
	}
}

代码效果如图所示:
在这里插入图片描述
在拖动界面大小时组件会自动排序,宽度不足则换行

3.卡片布局方式
CardLayout(卡片布局管理器)能够帮助用户实现多个成员共享同一个显示空间,并且一次只显示一个容器组件的内容。CardLayout 布局管理器将容器分成许多层,每层的显示空间占据整个容器的大小,但是每层只允许放置一个组件。自由定义显示哪个面板
示例代码:

public class Test extends JFrame{
    
	public Test() {
    
		    setTitle("Java 第四个 GUI 程序");    //设置显示窗口标题
	        setBounds(100,100,400,341);    //设置窗口显示位置及尺寸
	        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	        JPanel p1=new JPanel();    //面板1
	        JPanel p2=new JPanel();    //面板2
	        //CardLayout(int hgap, int vgap)可指定布局横纵间隔
	        JPanel cards=new JPanel(new CardLayout());    //卡片式布局的面板
	        p1.add(new JButton("登录按钮"));
	        p1.add(new JButton("注册按钮"));
	        p1.add(new JButton("找回密码按钮"));
	        p2.add(new JTextField("用户名文本框",20));
	        p2.add(new JTextField("密码文本框",20));
	        p2.add(new JTextField("验证码文本框",20));
	        cards.add(p1,"card1");    //向卡片式布局面板中添加面板1
	        cards.add(p2,"card2");    //向卡片式布局面板中添加面板2
	        CardLayout cl=(CardLayout)(cards.getLayout());
	        cl.show(cards,"card1");    //调用show()方法显示面板2
	        add(cards);
	        setVisible(true);    //设置窗口是否可见,注意,一般这个放最后面更合适
	}
	public static void main(String[] args) {
    
		new Test();
	}
}

代码效果图片:
在这里插入图片描述
当然还有其它布局方式,只不过最常用的是这几种,掌握一种,其它的举一反三就行了
如果你想要自定义布局(就是组件想放在JFrame哪个地方就放哪个地方)首推的就是不新建Jpanel,这样你的组件可以放在JFrame自带的Jpanel的任意地方。不用按照规定方式来布局
swing学习参考资料:资料

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43909848/article/details/123091395

智能推荐

DP mixture model-程序员宅基地

文章浏览阅读65次。http://people.csail.mit.edu/jacobe/software.html转载于:https://www.cnblogs.com/stoneresearch/archive/2011/09/03/4336539.html_dpmm饭圈

Python对Linux系统的操作,打开文件与读写文件,python模拟linux的cp操作_python读取linux文件-程序员宅基地

文章浏览阅读1.1w次。cp操作请跳到第10节1.open内建打开文件函数作为打开文件的“钥匙”,内建函数open()提供了初始化输入/输出(I/O)操作的通用结接口成功打开文件后会返回一个文件对象,如果打开失败会引发一个错误示例:file_object = open(file_name,mode='r')file_object 是python的变量名用来保存文件对象mode是打开的方式,以读..._python读取linux文件

Celo中的随机数_uint(keccak256(abi.encodepacked(blockhash(block.nu-程序员宅基地

文章浏览阅读208次。1. 引言在无需可信第三方的情况下,实现不可预测的伪随机数的方案有:VRFVDFCommit-reveal当前,Celo项目采用的是简单的commit-reveal方案来随机选择Validator.对于某特定Validator propose的第nnn个区块,该Validator会在该区块内附加值(rn,sn)(r_n,s_n)(rn​,sn​),使得keccak256(rn)=sn−1\text{keccak256}(r_n)=s_{n-1}keccak256(rn​)=sn−1​。对于_uint(keccak256(abi.encodepacked(blockhash(block.number - 1), gasleft())))

HTML的层级_html怎么调层级-程序员宅基地

文章浏览阅读1.4k次。在网页中,对于已经开启定位的元素可以设置元素层级,如果定位的元素层级是一样的, 下边的元素会盖住上边,在定位的情况下,通过z-index属性设置元素的层级,属性值:是一个正整数,层级越高,优先级也就越高 .box{ width: 200px; height: 200px; } .box1{ background-color: rebeccapurple; position:relative; _html怎么调层级

数据标签化:如何通过标签化数据进行文本分类和自然语言处理自然语言处理教程_简易自然语言处理标签化-程序员宅基地

文章浏览阅读2.8k次。在自然语言处理中,词性标注、命名实体识别、句法分析、语义理解、语音合成、信息检索、文档摘要等功能需要对输入文本进行分析处理。这些任务通常都涉及到大量的数据处理工作。例如,给定一个文本序列(如一段话或一篇文章),如何自动地确定其中的名词短语、动词短语、介词短语、形容词短语?这个过程被称之为词性标注。再比如,给定一段文本,如何识别出其中的人物、组织机构、地点、时间、日期、货币金额等实体?这个过程被称之为命名实体识别。每当我们阅读、回复、输入文字时,都离不开这些功能,它们的背后都是复杂的计算过程。_简易自然语言处理标签化

数据结构与实验报告二—— 链表的基本操作及应用(图书管理系统)_数据结构链表实验报告-程序员宅基地

文章浏览阅读8k次,点赞4次,收藏72次。第一章实验目的1.掌握线性表的链式存储结构的表示和实现方法。2.掌握单链表基本操作的算法实现。3.了解单链表的应用。第二章 实验环境硬件环境要求:PC机(单机)使用的软件名称、版本号以及模块:DEV C++、VS2010等。第三章 实验内容1.编写一个程序,实现单链表的各种基本运算(假设单链表的元素类型为char),并在此基础上设计一个主程序完成如下功能:(1)初始化单链表h;(2)依次采用尾插法插入a、b、c、d、e元素;(3)输出单链表h;(4)输出单链表h的长度;(5)判_数据结构链表实验报告

随便推点

cpickle支持的python版本_Python序列化模块pickle和cPickle-程序员宅基地

文章浏览阅读113次。Python的序列化是指把变量从内存中变为可以储存/传输的数据/文件的过程. 在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。在Pytho..._cpickle.dump(obj, f, protocol)

Stream.generate-程序员宅基地

文章浏览阅读3.1k次。static<T>Stream<T>generate​(Supplier<? extends T>s)该方法主要用于生成一个无限连续的无序流,流中的元素由用户定义的supplier函数生成。看个简单例子:运行结果:aa该方法一般配合limit方法使用,在这个例子中我们使用limit方法限制这个无限流的长度为2,因此最终打印出两个a。加入我们不使用limit方法限制流长度会出现什么情况?测试一下。Stream<String> ..._stream.generate

tmux分屏解决方案_tmux的分窗口分不了-程序员宅基地

文章浏览阅读326次。安装使用个人推荐方案(自定义按键)先ctrl+a,再输入命令 - u/i : 创建水平/竖直新窗口 - o : tab - h/j/k/l : 更改当前窗口大小_tmux的分窗口分不了

json文件的格式转换_json格式转换-程序员宅基地

文章浏览阅读4.8k次。温故而知新。_json格式转换

使用gradle build项目报错:Main class name has not been configured and it could not 问题处理-程序员宅基地

文章浏览阅读1.8w次,点赞3次,收藏4次。Execution failed for task ‘:api:bootJar’.> Main class name has not been configured and it could not这里记录一个Bug处理:Task :api:bootJar FAILEDFAILURE: Build failed with an exception.What went wrong:Execution failed for task ‘:api:bootJar’.Main clas_main class name has not been configured and it could not be resolved

UE4自定义点击区域的Button-程序员宅基地

文章浏览阅读2.3k次,点赞3次,收藏14次。UE4自定义点击区域的Button一、创建继承与Button的C++文件二、在项目.Build.cs文件中添加如下引用PrivateDependencyModuleNames.AddRange(new string[] { "UMG", "Slate", "SlateCore" });三、代码.h#pragma once#include "Engine.h"#include "Runtime/UMG/Public/UMG.h"#include "Runtime/UMG/Publ

推荐文章

热门文章

相关标签