专注Java教育14年 全国咨询/投诉热线:444-1124-454
赢咖4LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java图形界面的组成

Java图形界面的组成

更新时间:2022-04-29 10:46:32 来源:赢咖4 浏览1468次

很多小伙伴对Java图形界面的组成还不是了解,赢咖4小编就来为大家讲解一下。我们在平时生活中用电脑的时候,我们可以发现我们所运行的所有的程序基本都是在某一个窗口中运行。这个窗口可以实现我们和程序的交互,可以让一个程序更加的精彩和多元。实际上现在我们所用的很多操作系统都是以窗体为基础实现自己程序或者软件的功能。

实际上我们经常使用的MicroSoft Windows系统中的“Windows”就是“窗口”的意思。

1.Java提供的图形界面组件

(1)AWT组件

AWT(Abstract Window Toolkit),中文译为抽象窗口工具包,该包提供了一套与本地图形界面进行交互的接口,是Java提供的用来建立和设置Java的图形用户界面的基本工具。AWT中的图形函数与操作系统所提供的图形函数之间有着一一对应的关系,称之为peers,当利用AWT编写图形用户界面时,实际上是在利用本地操作系统所提供的图形库。由于不同 操作系统的图形库所提供的样式和功能是不一样的,在一个平台上存在的功能在另一个平台上则可能不存在。为了实现Java语言所宣称的“一次编写,到处运行(write once, run anywhere)”的概念,AWT不得不通过牺牲功能来实现平台无关性,也即AWT所提供的图形功能是各种操作系统所提供的图形功能的交集。

AWT组件是Java在JDK1.0时期推出的图形界面类,也是整个Java中最基本的图形界面类,是一切图形界面的基础。我们把AWT组件称为重量级组件。因为这些组件的实现是调用了操作系统底层的绘图函数。也就是说AWT组件类与操作系统有着密切的联系。

(2)SWING组件

如上所述,Java的图形界面组件类致力于“一次编写,到处运行”,也就是跨操作平台运行。而AWT组件却和操作系统的底层绘图函数紧密联系,这就直接导致了AWT组件不得不牺牲一部分功能来实现跨平台。

Java为了解决这个问题,他们在JDK1.4的时候推出了SWING这套采用纯Java代码编写的轻量级组件。也就是说,这条组件仅仅是以AWT为基础,与操作系统没有直接的联系。SWING组件很好的实现了Java的跨平台性,也是我们以后使用的最主要的组件类。

(3)JavaFX组件

JavaFX是JDK1.7的时候推出的图形界面组件类。这里不过多介绍。

2.常用的组件类

(1)容器组件类

所谓容器,就是类似于收纳盒、包、锅碗瓢盆等可以容纳东西的物体。类似地,容器组件就是指可以容纳其他组件的组件,最典型的就是我们经常看到的窗口(窗体)组件。

JFrame是SWING包下的顶级容器组件类。所谓顶级容器,就是说它只能装别的组件,而不能被其他组件所包含。JFrame的作用就是实现一个基本的窗口以及其开关。调整大小等作用。

JPanel是SWING包下的一个容器组件,我们称之为“面板”,可以加在窗体上以实现我们想要的各种布局。

(2)元素组件类

元素组件就是想按钮、标签、复选框等的一类实现某种具体功能的组件。我们经常使用的有以下几种:

JLabel 标签元素组件类 显示文字或者图片

JTextField 文本输入框元素组件类 接收输入信息,将输入信息显示出来

JPasswordField 密码输入框元素组件类 接收输入信息,将输入的信息以某个符号代替显 示

JCheckBox 复选框(多选框)元素组件类 首先又一个选择框,在选择框后还能显示文字或 者图片信息

JButton 按钮元素组件类 显示文字或图片,提供一个点击效果

(3)辅助类

辅助类就是那些有助于我们优化界面或者帮助某个组件完成功能的类。典型的常用的类有如下几个:

javax.swing.ImageIcon 图标类。将磁盘上的图片文件加载到程序中。

java.awt.FlowLayout 流式布局类。流式布局类似word文档(所有的布局类都只能应用于容器组件上) 在java.awt和javax.swing包下所有以Layout结尾的类都是布局类

java.awt.Dimension 封装类。用来封装组件的宽度和高度

BorderLayout 边框布局。把容器分为上北下南左西右东中间五个部分,这五个部分的组成如下:

我们可以对边框布局的五个部分进行大小的设置。从上图中我们可以看到对于南北两个部分我们只能设置它的高度,它的宽度和窗体的宽度是一致的;对于东西两个部分我们可以设置它的宽度,它的高度有嫩被两个部分以及窗体的高度决定;对于中部,我们可以直接设置它的长宽。

3.实例——登录界面的实现

(1)定义一个“login”类,这个类带有初始化界面的方法和主函数

(2)在主函数中,实例化Login类的对象,然后用对象名来调用初始化界面的方法。

(3)在初始化界面的方法中,实例化JFrame窗体容器组件类的对象。

(4)设置窗体容器组件对象的属性值:标题、大小、显示位置、关闭操作、布局、可见、...

以上四步代码如下:

package test;
import java.awt.Color;
import javax.swing.JFrame;
public class Login {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Login l = new Login();//实例化一个Login对象。
		l.initUI();//调用初始化窗体的方法。
	}
	public void initUI(){
		javax.swing.JFrame frame = new javax.swing.JFrame();//实例化一个窗体对象
		frame.setTitle("登陆界面");//设置窗体的标题
		frame.setSize(800,800);//设置窗体的大小
		frame.setLocationRelativeTo(null);//设置窗体的位置为居中
		frame.setResizable(false);//设置不可调节大小
		frame.setDefaultCloseOperation(3);//设置窗体的关闭操作。这个方法有0 1 2 3四个返回值。其中0是指不关闭,也就是说无论点击多少次关闭按钮都不会有反应。1是指点击关闭按钮会关闭这个窗体但是程序依然在后台运行。2是指如果有多个窗体就关闭当前窗体,如果只有一个则关闭程序。3是指直接关闭程序。
		frame.setBackground(Color.LIGHT_GRAY);//设置窗体的背景颜色
		frame.setVisible(true);//设置窗体可见。如果不设置这一步那么窗体看不见。另外所有的组建都要加在这个方法之前,否则不可见。
	}
}

这时候运行该程序的效果如下:

(5)实例化元素组件对象并添加到窗体上:

package test;
import java.awt.Color;
import java.awt.Font;
import javax.swing.JFrame;
public class Login {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Login l = new Login();//实例化一个Login对象。
		l.initUI();//调用初始化窗体的方法。
	}
	public void initUI(){
		javax.swing.JFrame frame = new javax.swing.JFrame();//实例化一个窗体对象
		frame.setTitle("登陆界面");//设置窗体的标题
		frame.setSize(800,800);//设置窗体的大小
		frame.setLocationRelativeTo(null);//设置窗体的位置为居中
		frame.setResizable(false);//设置不可调节大小
		frame.setDefaultCloseOperation(3);//设置窗体的关闭操作。这个方法有0 1 2 3四个返回值。其中0是指不关闭,也就是说无论点击多少次关闭按钮都不会有反应。1是指点击关闭按钮会关闭这个窗体但是程序依然在后台运行。2是指如果有多个窗体就关闭当前窗体,如果只有一个则关闭程序。3是指直接关闭程序。
		frame.setBackground(Color.LIGHT_GRAY);//设置窗体的背景颜色
		javax.swing.ImageIcon image = new javax.swing.ImageIcon("C:\\Users\\Apple\\Pictures\\Saved Pictures\\冠军.jpg");//实例化一个图片对象,并引用图片路径
		javax.swing.JLabel Limage = new javax.swing.JLabel(image);//实例化一个标签对象,并把上面的图片对象添加上去。
		frame.add(Limage);//在窗体上添加标签
		javax.swing.JLabel Lname = new javax.swing.JLabel("账号:");//实例化一个标签对象并调整字体、大小
		Lname.setFont(new Font("楷体",Font.BOLD,20));
		frame.add(Lname);//添加到面板,下同
		javax.swing.JTextField Tname = new javax.swing.JTextField();//实例化一个文本输入框对象并调整大小
		java.awt.Dimension dim = new java.awt.Dimension(300,30);
		Tname.setPreferredSize(dim);
		frame.add(Tname);
		javax.swing.JLabel Lcode = new javax.swing.JLabel("密码:");//实例化一个标签对象并调整字体、大小
		Lcode.setFont(new Font("楷体",Font.BOLD,20));
		frame.add(Lcode);
		javax.swing.JPasswordField Pcode = new javax.swing.JPasswordField();//实例化一个密码输入框对象并调整大小
		java.awt.Dimension Pdim = new java.awt.Dimension(300,30);
		Pcode.setPreferredSize(Pdim);
		frame.add(Pcode);
		javax.swing.JCheckBox C1 =new javax.swing.JCheckBox("记住密码");//实例化一个复选框对象并调整字体、大小
		C1.setFont(new Font("楷体",Font.BOLD,20));
		frame.add(C1);
		javax.swing.JCheckBox C2 = new javax.swing.JCheckBox("自动登录");//实例化一个复选框对象并调整字体、大小
		C2.setFont(new Font("楷体",Font.BOLD,20));
		frame.add(C2);
		javax.swing.JButton Blogin = new javax.swing.JButton("登录");//实例化一个按钮对象并调整字体、大小
		Blogin.setPreferredSize(new java.awt.Dimension(300,40));
		Blogin.setFont(new Font("楷体",Font.BOLD,20));
		frame.add(Blogin);
		frame.setVisible(true);//设置窗体可见。如果不设置这一步那么窗体看不见。另外所有的组建都要加在这个方法之前,否则不可见。
	}
}

看起来好像加齐了,我们运行试一试:

好大一个登录按钮!!!!!

这是为什么?

JFrame窗体的默认布局是边框布局,也就是说我们前面要加的东西确实已经加上去了,但是被一层一层覆盖掉了。所以这个时候我们就需要设置一下窗体的布局。我们可以把窗体设置成流式布局(FlowLayout)

java.awt.FlowLayout 流式布局类。流式布局类似word文档(所有的布局类都只能应用于容器组件上)我们给上面加一段代码:

java.awt.FlowLayout fl = new java.awt.FlowLayout();
//实例化一个布局对象
frame.setLayout(fl);调用这个对象

这段代码要加在上面设置背景颜色之后。

加上这段代码我们再来一次:

是不是好了很多?

4.优化上述登录界面

上面我们成功地做出来了一个登录界面。但是 ··· 是不是还是不够漂亮?我们想一下,某社交软件的登录界面是怎样的?是不是头像占据了两行的位置,它的右边是账号密码?这个好像在流式布局中树没办法实现的啊。

于是,我们就要用到“东西南北中”的边框布局和“JPanel”面板了。

我们快同意根据自己的需要把JPanel面板对象加在边框布局的任何一部分里。而边框布局的每一个部分之中是默认的流式布局,面板中默认也是流式布局。这样一想,我们是不是就可以把那些元素组件单独的放在几个面板里面调整它们的大小属性,一球更加精致的界面了呢?

注意,下面不在将元素组件加在窗体上,而是加在面板上。

import java.awt.Font;
public class Login {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Login l = new Login();
		l.initUI();
	}
public void initUI() {
	javax.swing.JFrame frame = new javax.swing.JFrame();//初始化窗体结构
	frame.setTitle("登录");
	frame.setSize(800,800);
	frame.setDefaultCloseOperation(3);
	frame.setLocationRelativeTo(null);		
	javax.swing.ImageIcon image = new javax.swing.ImageIcon("C:\\Users\\Apple\\Pictures\\Saved Pictures\\冠军.jpg");
	javax.swing.JLabel Limage = new javax.swing.JLabel(image);
	frame.add(Limage,java.awt.BorderLayout.NORTH);//上部图片部分
	javax.swing.JPanel centerPanel = new javax.swing.JPanel();//中部面板设置
	javax.swing.JLabel Lname = new javax.swing.JLabel("账号:");
	Lname.setFont(new Font("楷体",Font.BOLD,20));
	centerPanel.add(Lname);//加在面板上!!!!
	javax.swing.JTextField Tname = new javax.swing.JTextField();
	java.awt.Dimension dim = new java.awt.Dimension(300,30);
	Tname.setPreferredSize(dim);
	centerPanel.add(Tname);//加在面板上!!!!
	javax.swing.JLabel Lcode = new javax.swing.JLabel("密码:");
	Lcode.setFont(new Font("楷体",Font.BOLD,20));
	centerPanel.add(Lcode);//加在面板上!!!!
	javax.swing.JPasswordField Pcode = new javax.swing.JPasswordField();
	java.awt.Dimension Pdim = new java.awt.Dimension(300,30);
	Pcode.setPreferredSize(Pdim);
	centerPanel.add(Pcode);//加在面板上!!!!
	javax.swing.JCheckBox C1 =new javax.swing.JCheckBox("记住密码");
	C1.setFont(new Font("楷体",Font.BOLD,20));
	centerPanel.add(C1);//加在面板上!!!!
	javax.swing.JCheckBox C2 = new javax.swing.JCheckBox("自动登录");
	C2.setFont(new Font("楷体",Font.BOLD,20));
	centerPanel.add(C2);//加在面板上!!!!
	javax.swing.JButton Blogin = new javax.swing.JButton("登录");
	Blogin.setPreferredSize(new java.awt.Dimension(300,40));
	Blogin.setFont(new Font("楷体",Font.BOLD,20));
	centerPanel.add(Blogin);//加在面板上!!!!
	frame.add(centerPanel,java.awt.BorderLayout.CENTER);//中部面板设置完成
	javax.swing.JPanel westPanel = new javax.swing.JPanel();//设置左边的面板
	javax.swing.ImageIcon Icon = new javax.swing.ImageIcon("C:\\Users\\Apple\\Pictures\\Saved Pictures\\队标.jpg");
	westPanel.add(new javax.swing.JLabel(Icon) );//加在面板上!!!!
	westPanel.setPreferredSize(new java.awt.Dimension(200,0));
	westPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT));//流式布局设置为靠右对齐
	frame.add(westPanel,java.awt.BorderLayout.WEST);//设置完成
	javax.swing.JPanel eastPanel = new javax.swing.JPanel();
	eastPanel.setPreferredSize(new java.awt.Dimension(200,0));
	frame.add(eastPanel,java.awt.BorderLayout.EAST);//右边的面板
	frame.setVisible(true);		
}
}

可以看到,我在上面的窗体上加入了四个面板,分别放在“东、西、北、中”四个部分上(边框布局是窗体的默认布局方式,不用单独设置)。下部由于没有要加的内容,就没有设置面板。

现在我们看看效果怎样:

现在是不是比上面那个舒服多了?

现在我们就成功地实现了一个简单的登录界面。如果大家想了解更多相关知识,不妨来关注一下赢咖4的Java赢咖4在线学习,里面的课程内容从入门到精通,细致全面,通俗易懂,适合没有基础的小伙伴学习,希望对大家能够有所帮助哦。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>