1 Swing
1.1
简单描述:
AWT是抽象窗口工具包,是Java最早的用于编写图形用户界面应用程序的开发包;
Swing时为了解决AWT存在的问题而新开发的包,它以AWT为基础,为AWT进行改良和扩展,是Java基础类库(JFC)的一部分。
详细描述:
AWT时抽象窗口工具包(abstrcat Windows TooloKit)的缩写,这个工具包提供了一套与本地图形界面进行交互的接口。AWT中的图形方法与操作系统所提供的图形方法之间有一一对应关系。也就是说,当我们利用AWT来构建图形用户界面时,我们实际上是在利用操作系统所提供的图形库。由于不同操作系统的图形库所提供的功能不一样,在一个平台上存在的功能在另一个平台上可能不存在。为了实现Java语言所宣传的“一次编译,到处运行”的概念,AWT不得不通过牺牲功能来实现其平台无关性,也就是说AWT所提供的图形功能是各种通用型操作系统所提供的图形功能的交集。由于AWT是依靠本地方法来实现其功能,我们通常把AWT控件称为重量级控件。
Swing是在AWT的基础上构建的一套新的图形用户界面系统,它提供了AWT所能够提供的所有功能,并且用纯粹的Java代码对AWT的功能进行了大幅度的扩充。由于在swing中没有使用操作系统本地方法来实现图形功能,我们通常把Swing控件称为轻量级控件。
1.2 Swing与AWT的区别是什么?
//重点
1)AWT是基于本地方法的C/C++程序,其运行速度快;Swing是基于AWT的Java程序,其运行速度慢;
2)AWT的控件在不同的平台可能表现不同,而Swing在所有平台表现一致。
1.3 Swing和AWT选择
在实际应用开发中,应该使用AWT还是Swing取决于应用程序所部属的平台类型。
1)对于一个嵌入式应用开发,目标平台的硬件资源非常有限,而应用程序的运行速度又是项目中至关重要的因素,简单而高效的AWT成了嵌入式开发的第一选择;
2)在普通的基于PC或者是工作站的标准Java应用开发中,硬件资源对应用程序所造成的限制往往不再是项目中的关键因素,所以在标准版的Java中则提倡使用Swing,也就是通过牺牲速度来实现应用程序的功能。
1.4 MVC
1.4.1 什么是MVC模型架构?
MVC是应用与Java界面开发的一种构架模式,咋这种构架模式中将界面以及操作分为了3个分离的功能部分。分别是模型(Model)、视图(view)和控制器(Controller)。
模型:用于存储界面上要显示的数据
视图:用于将模型中的存储的数据显示到界面上。
控制器:用于处理用户在界面上的各种操作并予以响应。
1.4.2 MVC过程
1)控制器接受用户的操作请求,并决定应该调用哪个模型的数据来处理;
2)模型用户请求进行相应的业务逻辑处理,并返回用户需要的数据;
3)控制器:用户处理用户将模型返回的用户数据显示到界面上。
1.4.3 MVC模型框架的优点:
1)多个视图可以共享一个模型,大大提高了代码的可重用性。意思是同一个模型数据可以在不同的视图上显示。
2)由于MVC的三部分是相互独立,改变其中一个不会影响到其它个,如果使用架构的编写额码 具有代码具有良好的松耦合性。
3)控制器提高了程序的灵活性和可配置型,即控制器可以用来连接不同的模型和试图去完成用户的需求。
1.5 Swing的分离模型构架
在sun公司开发swing时发现,因为视图和控制器存在很强的依赖关系,于是将视图和控制器合并在一起叫UI委托。这种经过调整后的MVC模型框架,在swing中称为模型委托构架或分离模型构架。
Swing的视图部分由组件组成(如按钮、对话框),其中容器室一种特俗的组件,它是用于存放其它的组件,而且容器也可以存放容器。Swing规定一个组件要显示在界面上,就必须至少放在一个容器里。
1.6 Swing的容器
Swing的容器分两种:一种是重量级容器 一种是轻量级容器。
1.6.1 重量级容器:
包括JFrame类(窗体),JDialog类(对话框),JWindows(窗口)。之所以称为重量级,是因为他们都继承AWT的Containner类。重量级容器为其它容器和组件的绘制提供位置,威哥Swing程序至少要创建一个重量级容器才可以显示界面。
1.6.2 轻量级容器:
包括JPanel类(面板)、JSlitPane类(分割窗格)、JScrollPanel类(滚动窗格)、JTabbedPane类(标签窗格)和JToolBar类(工具),以及一些专用的容器。之所以成为轻量级容器,是因为他们和其它普通组件一样,都是继承与Swing类的JCommponent类。轻量级容器的作用主要是为了方便定位其它组件。
Swing的组件多用于界面显示 如JButton类(按钮)、JRadioButton类(单选按钮)、JCheckBox类(浮选类)、JComboBox类(组合框)、JTextField类(文本)、JTextArea类(多行文本)等。这些组件通常不能包含其它组件,Swing的组件也继承于Swing类的JComponent类。
1.7 创建界面视图
创建界面视图的一般步骤
1、 自定义主窗体类
2、 应用程序的主窗体通常是通过继承于JFrame类创建的,创建的窗体默认有标题栏、最大化、最小化以及关闭功能等。
1)在构造器首行调用父类的有参构造器;
2)在构造器中调用窗体类的setBounds()方法设置窗体的初始位置和大小;
//设置窗体显示的初始位置和大小
setBounds(0,0,400,200);
3)设置窗体居中显示;
//设置窗体居中显示()
setLocationRelativeTo(null);
2、设置布局管理器
在构造器中调用setLayout()方法设置相应的布局管理器
3、添加组件
1)在构造器中实例化组件对象;
2)调用add()方法将组件对象添加到窗体容器中;
4、显示窗体
调用setVisible()
5、创建主窗体对象
在main()方法中实例化自定义的主窗体类
1.8 Swing的布局管理器
当一个窗口的组件较多时,界面应该简洁、整齐、防止合理。Java采用布局管理器对容器中的组件进行相对布局。当改变容器大小时,或者改变组件的大小,或者改变组件之间的相对位置,可以保证组件不会被覆盖并且容器没有空白区域。
Java中提供了多种风格和特点的布局管理器,每一种布局管理器指定一种组件之间的相对位置。
Swing中提供的常用布局管理器有四种。
1.8.1 FlowLayout管理器
FlowLayout管理器:也叫流失布局管理器。它将容器内组件按照从左到右的流式顺序布局。
特点:
1)组件在容器中大小事组件的首选大小;
2)组件添加到容器中的先后顺序决定其在容器中的左右排列顺序;
3)如果容器的宽度不足以显示所有组件,组件会换行显示;
4)可以控制组件居中、居左、居右显示;
5)可以控制组件的垂直和水平间距。
注意:JPanel类容器室默认采用流失布局管理器
1.8.2 BorderLayou 管理器
BorderLayou 管理器:也叫边框布局管理器,他讲容器分为东南西北中五个区域,
每个区域只能添加一个组件,并且组件的大小时由它出现的区域决定。
特点:
1)组件使用add()方法添加到容器中,需要传递一个表示某个区域的参数;
2)不需要添加组件到容器五个区域的每个区域,如果一个区域没有添加组件,将会被相邻区域的其他组件占据.
3)添加到北和南区域的组件将是首选组件高度,但宽度是容器的宽度.添加到东和西两个区域的组件是首选组件宽度,但其高度是容器的高度减去北河南区域的高度.
4)添加到中区域的组件的高度和宽度 都不是首选,其大小由其他四个区域的组件未占据的区域决定.
注意:JFrame类容器是默认采用边框布局管理器的.
1.8.3 GridLayout管理器
GridLayout管理器:也叫网格布局管理器,它将容器分为指定的行和列的网格.
特点:
1)一个网格区域只能添加一个组件,组件的大小与网格大小相同.
2)网格每个区域的大小相同.当容器缩放时,网格内的每个区域也会缩放.
3)组件添加到容器中的先后顺序决定其在容器中的行列排列顺序.
1.8.4 BoxLayout管理器
BoxLayout管理器:也叫盒式管理器,它将容器中的组件按照垂直或水平形式显示.
特点:它与其他布局管理器稍不同,必须向其构造器中传递容器引用,由该容器使用盒式布局管理器.
注意:BoxLayout布局管理器往往和Box容器结合一起使用,原因是他的构造器无法设置组件之间的间距.使用Box容器提供的透明的组件作为填充来占据组件之间的间距,从而间接达到调整组件之间间距的目的.
1.8.5 其他布局管理器:
GridBagLayout管理器:该布局管理器是Swing当中最灵活也是最复杂的布局管理器,可以对空间在容器中的位置进行比较灵活的调整.
绝对布局(不使用布局管理器)
就是通过setLayout(null)方法取消设置容器的布局管理器,然后自定义每个组件在容器的绝对放置位置.当容器大小改变时,组件大小和位置不变.
1.9 事件监听器
用户对组件的一个操作,称为一个事件(Event)(如点击一下按钮的操作)
产生事件的组件,称为事件源(Event Souce)(如被点击的按钮就是事件源)
对产生事件的组件进行监听,称为事件监听器(如监听按钮有没有产生事件)
对事件监听器监听到的事件进行处理,称为事件处理(Event Handle)
事件处理机制的流程:
1)注册事件源(组件)的事件监听器;
2)用户操作事件源(组件)产生事件;
3)事件被注册的监听器监听到;
4)监听器对事件惊醒处理。
1.10 事件适配器
自定义一个事件监听器类必须实现一个监听器借口,那么就意味着该借口的所有抽象方法都必须在自定义的监听器类中被实现.但如果一个监听器接口中有很多抽象方法,而其中一些抽象方法并不是我们所关注的,我们也不得不去实现,这导致我们会编写一些冗余的代码,降低了开发效率.事件适配器就是专门用来解决这一问题.
时间适配器的工作原理很简单,它是一个类,这个类用空方法实现了监听器接口中的所有抽象方法,我们只需要集成事件适配器,然后重写我们关注的方法即可.
main函数加入 可以改变界面风格
JFrame.setDefaultLookAndFeelDecorated(true);
//关闭
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//文本框不能输入
textArea.setEditable(false);
//设置大小不能改变
setResizable(false);