----------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------------
GUI(图形用户界面)
一、GUI(图形用户界面)
1、概述
两种和用户交互的方式:
GUI Graphical User Interface(图形用户接口)
用图形的方式,来显示计算机操作的界面,这样更方便直观。
CLI Command lint user interface(命令行用户接口)
就是常见的dos命令行操作。 需要记忆一些常用的命令,操作不直观。
举例
比如:创建文件夹,或者删除文件夹等
2、工具包
Java为GUI提供的对象都存在java.Awt和javax.Swing两个包中。
Awt和Swing
Java.Awt:Abstact Window ToolKit(抽象窗口工具包),需要调用本地系统方法实现功能。有点依赖平台。所以跨平台性不是特别好。属重量级控件。
javax.Swing:在Awt的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由java实现。增强了移植性,属轻量级控件。由它开发的软件在任何系统下显示的效果都一模一样。
3、继承关系图
说明:Container:为容器,是一个特殊的组件,该组件中可以通过add方法添加其他组件进来。
而其他组件,不能添加其他组件。
二、布局
有了组件,我们就开始考虑,这些组件该怎么排放的问题。
l 布局管理器
容器中的组件的排放方式,就是布局
l 常见的布局管理器:
FlowLayout(流式布局管理器)
从左到右的顺序排列
Panel默认的布局管理器
BorderLayout(边界布局管理器)
东,南,西,北,中
Frame默认的布局管理器
如果没有指定东南西北,这个组件就会以最大面积覆盖窗体。再添加,就是覆盖。
GridLayout(网格布局管理器)
规则的矩阵
CardLayout(卡片布局管理器)
选项卡
GridHaglAyout(网格包布局管理器)
非规则的矩阵
三、GUI——Frame
1、Component
查阅API,我们先从父类开始看
Component
public abstract class Component extends Object implements ImageObserver, MenuContainer, Serializable
component 是一个具有图形表示能力的对象,可在屏幕上显示,并可与用户进行交互。
public class Container extends Component
一般的 Abstract Window Toolkit(AWT) 容器对象是一个可包含其他 AWT 组件的组件
看完了父类的方法,接着,我们看用子类去创建对象。
2、Frame
public class Frame extends Window implements MenuContainer
Frame 是带有标题和边框的顶层窗口。
构造函数
Frame()
构造一个最初不可见的 Frame 新实例()。
Frame(GraphicsConfiguration gc)
使用指定的 GraphicsConfiguration 构造一个最初不可见的新 Frame。
Frame(String title)
构造一个新的、最初不可见的、具有指定标题的 Frame 对象。
Frame(String title, GraphicsConfiguration gc)
构造一个新的、初始不可见的、具有指定标题和 GraphicsConfiguration 的 Frame 对象。
Component方法:
void setVisible(boolean b)
根据参数 b 的值显示或隐藏此组件。
3、建立一个简单的窗体
Container常用子类:Window Panel(面板)不能单独存在
Window常用子类:Frame Dialog
4、 创建窗体的步骤
创建图形化界面
1 创建frame窗体
2 对窗体进行基本设置
3 定义组件
4 将组件通过窗体的add方法添加的窗体中
5 让窗体显示,通过setVisible(true)
四、GUI——事件监听机制
有了组件,我们还需要给界面加上效果。
1、事件监听机制组成
事件源(组件)
事件(Event):每一个事件源都有自己特有的对应事件和共性事件。
监听器(Listener):将可以触发某一个事件的动作(不止一个动作)都已经封装到了监听器中。
事件处理(引发事件后处理方式):
前三种,在java中都已经定义好了,直接获取使用就可以。我们要做的就是对产生的动作进行处理。
2、事件监听机制流程图
说明:用户对组件的操作,就是一个事件,那么在事件中的组件就是事件源
接收并处理事件:与用户进行交互的行为就是事件处理器
这些处理方式都封装在监听器中。
就如同开密码锁:入了安全,密码锁上安装了报警装置,只要锁被砸就会把锁时间通知保安,那么保安就有相应的处理方式。
如果锁没有被砸,而是密码输入错误,那么报警装置也会将锁事件通知保安,保安也会有相应的处理方式。
那么锁就是事件源,报警装置就是监听器,可以用来监听引发事件的动作,但必须要注意锁被砸保安是不知道的。对于每一种动作都有不同的处理方式。
监听器是定义在密码锁里面的,里面有对砸事件参数的砸方法的定义,当产生外力去砸锁时,就产生了一个密码锁异常状况事件,并被封装成了对象,该对象中包含着事件源。事件一触发,就被传递给了监听器,触发了处理动作。
但是,并不是简单一个动作,撬,也构造异常。
所以监听器里面,定义的就是
砸(密码锁异常事件)
撬(密码锁异常事件)
3、窗体事件
4、加载事件机制步骤
1确定事件源
2 选择监听器
3加载事件动作
说明:
比如上例中,
窗体是事件源,找其所属方法。最靠谱应该找找父类window
void addWindowListener(WindowListener l)
添加指定的窗口侦听器,以从此窗口接收窗口事件。
但是发现WindowListener是一个接口,需要实现7个方法,才能创建监听器对象,可是我只用到关闭的动作。
看看有没有已经实现的子类,发现有一个抽象类WindowAdapter,发现这个类虽然是抽象类,却没有抽象方法,说明它把WindowListener接口的方法全复写了。
public abstract class WindowAdapter extends Object implements WindowListener, WindowStateListener, WindowFocusListener
接收窗口事件的抽象适配器类。此类中的方法为空。此类存在的目的是方便创建侦听器对象。
因为WnodwListener的子类WindowAdapter已经实现了WindowListener接口。并覆盖了其中的所有方法,那么我只要继承自WindowAdapter覆盖我需要的方法即可。
处理动作:让程序停止运行即可。
5、Action事件
component
void setBounds(int x, int y, int width, int height)
移动组件并调整其大小
Button
Void addActionListener(ActionListener l)
添加指定的动作侦听器,以接收发自此按钮的动作事件。
ActionListener也是一个接口,但它的子类中没有适配器,
适配器的作用就是方便建立监听器对象,因为接口中要实现的方法太多,没办法一一实现,用适配器就可以做到需要哪一个方法,就复写哪一个方法。而button中的ActionListener里面只有一个方法,不需要适配器。它也是少数不需要适配器接口的其中一个。
只要接口中方法超过三个,几乎都有适配器。
6、GUI——鼠标事件
共性事件:鼠标,键盘
Component
void addKeyListener(KeyListener l)
添加指定的按键侦听器,以接收发自此组件的按键事件。
void addMouseListener(MouseListener l)
添加指定的鼠标侦听器,以接收发自此组件的鼠标事件。
同样,我们打开MouseListener接口,里面有五个方法。有适配器。
一个问题:我们知道按钮还有一个活动监听,那么我们点击按钮的时候,到底谁会先执行呢?
试验证明:是鼠标事件先发生,然后才有活动事件.,因为鼠标事件要比活动事件更加具体一些。
而且,光标不点击按钮,鼠标点击,按钮的活动事件一样可以执行。
按钮只要被活动,活动事件就可以发生。鼠标键盘都可以让按钮活动。
所以,我们加事件的时候,尽量加ActionEvent
7、对话框Dialog
对话框一般不会单独存在,一般都是用户操作一个事件后,才弹出对话框。所以它要依赖于窗体。
最基本的对话框一般有两个元素:信息,和确定按钮
信息使用label
Dialog(Dialog owner, String title, boolean modal)
构造一个最初不可见的 Dialog,它带有指定的所有者 Dialog、标题和模式。
模式为true时,当对话框不操作时,所属的窗体也操作不了。
练习:列出指定目录内容
界面:
在文本框中输入目录,点击“转到”按钮,将该目录中的文件与文件夹名称列在下面的文本区域中.
8、菜单
1)Menu 菜单
MenuBar 菜单栏
public class MenuBarextends MenuComponentimplements MenuContainer, AccessibleMenuBar 类封装绑定到框架的菜单栏的平台概念。为了将该菜单栏与 Frame 对象关联,可以调用该框架的 setMenuBar 方法。
2)关系图
MenuItem
|----Menu
而 Menu add(MenuItem)
菜单既可以添加它的父类,也可以添加自己。
应用:
文件对话框 Dialog——FileDialog 模式为打开模式
文件对话框Dialog----FileDialog 模式为保存模式
9、GUI——jar包双击执行
1) 先打包
Javac -d d:\myclass MyMenu
Jar 包
Jar -cvf my.jar mymenu
需要把主函数的类告诉jar包。它才会找那个类去执行。
打开jar包中的MANIFEST.MF文件
把主函数信息添加里面去
2)如何给jar包添加配置信息
1 建立一个txt文件,把配置信息写进去
写入
Main-Class: mymenu.MyMenuTest
必须有空格,和回车以方便区分
2 控制台中,jar命令
Jar -cvfm my.jar 1.txt mymenu
3 再打开配置文件,有主函数信息了。
4 jar文件必须在本地注册才能使用
窗口中——工具——文件夹选项——文件类型——jar executable Jar File
——高级——操作 ——把 “d:\jare6\bin\javaw.exe-jar”添加到用于执行的应用程序,如果是双击版本的java,就可以不用添加,系统会自动添加
说明:
1)在固定格式中:
a、如果无空格:在编译的时候,就会报IO异常,提示无效的头字段,即invalidheader field。这说明1.txt在被IO流读取。
b、如果无回车:在列表清单.MF中不会加入相应的加载主类的信息,也就是说配置清单的属性主类名称不会加载进清单中,也就不会执行。
2)jar文件必须在系统中注册,才能运行。注册方法如下:
A.对于XP系统:
a.打开任意对话框,在菜单栏点击工具按钮,选择文件夹选项
b.选择新建--->扩展名,将扩展名设置为jar,确定
c.选择高级,可更改图标,然后点击新建,命名为open,
d.在用于可执行应用程序中,点浏览,将jdk下的bin的整个文件路径添加进来,并在路径后添加-jar即可。
B.对于win7系统:
a.改变打开方式:右击.jar文件,点击打开方式,选择默认程序为jdk下bin中的javaw.exe应用程序。
b.修改关联程序的注册表:打开注册表(win+r),找到注册表路径\HKEY_CLASSES_ROOT\Aplications\javaw.exe\shell\open\command下的字符串值,右击点修改,在原路径的中添加-jar,如:"C:\ProgramFiles\Java\jre6\bin\javaw.exe" -jar "%1",注意-jar两边要有空格,保存。
c.双击即可执行jar程序。