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