01-GUI(概述)
终于要学图形用户界面啦,啦啦啦φ(≧ω≦*)♪
我们有两种和用户交互的方式,一种是命令行(这节课之前我们一直用的方式),另一种就是图形用户界面。
Java为GUI提供的对象都存在java.Awt和javax.Swing两个包中。
这两个包有什么区别呢?
java.Awt:Abstract Window ToolKit(抽象窗口工具包),需要调用本地系统方法实现功能,属重量级控件。
但它的缺点是有点依赖平台,跨平台性不太好。所以为了提高跨平台型,Java又为我们提供了另外一个包:
javax.Swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现,增强了移植性,属轻量级控件。
我们以后开发组件一般都是用javax.Swing哦。
我们都知道,Eclipse是用纯Java编写,但是它用的既不是Awt界面也不是Swing界面,而是Swt界面。这个外观包也是基于Awt的,但是是IBM支持Eclipse的这个小组独立编写的图形化外观包。
也就是说,现在做图形化界面的有Awt、Swing、Swt,Swt可在官网上下载到。
在图形化界中,到底提供了哪些组件供我们使用呢?
来看一下它的组成:
02-GUI(布局)
窗体中组件的排放方式,叫做布局。
常见的布局管理器:
(接下来的课程中为了节省时间,有现成的文字就不手打啦,都直接通过截屏贴过来哦)
流式布局管理器:
边界布局管理器:
在边界布局管理器中,若没有指定组件的方位,则会变成这样。充斥整个画面:
网格布局管理器:
网格包布局管理器:
卡片布局管理器:
我们需要哪种布局,new这个布局管理器的对象就可以啦。但是做图像界面最痛苦的也在这儿,做之前都要先打个草稿,先把图形化界面用笔画一画,要不然做出来的东西虽然功能都实现了,但是可能会奇丑无比。
还有一个很腻害的布局方式,就是坐标式,我们想将组件放在哪里就放在哪里。这也是让我们用高级一些的编译器的原因,到时候直接将组件拖拉拽进画面中,代码就自动生成了。当然,我们现在刚开始学还是采取手写代码的方式。
如果我们一个页面同时需要多种布局方式,只需要给画面中插入多个panel,然后设置每个panel的布局方式就OK啦。
03-GUI(Frame)
讲了这么多,接下来我们手写代码来构造图形化界面:
图形化界面是由另外一个线程控制的,只要开启图形化界面,就会多一个线程。
我们看到,这个图形化界面好mini哦:
不过它可以拉大:
设置它的尺寸,第一个数字是长,第二个数字是宽:
我们发现,每次窗体出现都是在固定的位置:屏幕的左上角,我们重新设置一下它出现的位置:
添加一个按钮:
我们发现按钮充斥了整个窗体。Frame这个窗体在new完对象之后具备一个默认的布局管理器:边界式布局,因为我们没有指定按钮的东南西北,所以如上图所示,它居中填充了。
我们修改一下界面的布局管理,设置成流式布局:
总结一下,创建图形化界面的思路:
其实,创建一个图形化界面并不难,更重点的是实现图形化界面的功能,我们发现,点button并没有什么反应,而且该死的竟然点叉叉都关不掉这个窗体。。。
04-GUI(事件监听机制)
想让我们的组件有效果,就要涉及到事件监听机制了。
什么叫事件监听机制呢?
简单点说,创建一个组件,给这个组件搞一些事情,只要这些事情一发生,这个组件就会有一些效果。
事件监听机制的流程图:
举个例子,我们安装了一个锁,这个锁一被砸警报器就会响。
锁就相当于事件源,警报器就相当于监听器,1,将锁和警报器连接起来,就是将监听器注册到事件源。
砸是外部动作,2,发生了砸这个动作,就是有监听器所监听的动作作用于事件源上。
这时,3,监听器监听到了砸这个动作,立刻产生了事件。这个事件会被封装成一个对象,这个事件对象中记录了到底是哪个密码锁之类的具体信息,
4,将事件对象传给事件处理方式。谁在监听这个动作就传给谁。
传过来之后,这个监听器里面就会有相对应的事件处理方式。
图示表示锁被砸后的事件:
事件监听机制包含了这几个部分,而需要我们去做的,就是事件的处理方式这一部分。
事件监听机制的特点:
05-GUI(窗体事件)
接下来我们为我们创建的窗体注册一个监听事件,就要用到addWindowListener这个方法,但是它需要传一个WindowListener类型的参数:
WindowListener是一个接口,如果实现它,就要复写里面的7个方法,实在太麻烦了,我们只需要用到关闭的动作,这个时候,它有一个子类WindowAdapter已经实现了WindowListener接口,并覆盖了其中的所有方法(虽然它里面的方法都是空的,因为它就是为了被这样使用),那么我们只需要继承WindowAdapter类并且覆盖我们需要用到的方法就好啦。
OK,我们写一个MyWin的类继承WindowAdapter类:
这时,将MyWin对象传入addWindowListener方法就好啦:
注意哦,它们是awt的一个子包event中的对象,所以记得导入这个包哦:
涉及到事件监听都不要忘记导入这个包哦。
现在运行,我们一点关闭按钮就触发了窗体事件:
因为我们复写的方法中只有打印的功能,所以每次点击它只是打印了window closing字符串,窗体并没有关闭。
我们也可以打印一下打印事件的详细信息:
点关闭会打印事件所属的信息:
刚刚只是试一试,下面这句才是正正经经的关闭窗体的语句:
除了上面这种方法,我们也可以写一个匿名类:
同样可以实现窗体的关闭。
除了窗体关闭事件,还有其他两个事件windowActivated和windowOpened也了解一下哦:
06-GUI(Action事件)
接下来我们把事件的代码和图形化界面组件的代码分离出来,下面是比较规范的代码示例:
下面我们添加一个退出按钮,让它具备退出功能:
07-GUI(鼠标事件)
鼠标事件和键盘事件,几乎所有的组件都具备,我们在component类中找到这两个方法:
addMouseListener中传入了一个MouseListener接口型的数据,我们看一下MouseListener这个接口:
它里面的方法对鼠标事件划分非常细:
我们试一下鼠标进入事件,直接把上节课的代码拿来用,将新的代码添加进去:
同理,鼠标点击事件:
按钮还有一个监听器叫做活动监听,点击按钮后点击事件和活动监听谁会发生呢?
后续不点击鼠标,但是用键盘,活动监听就会执行,因为只要按钮被活动着,不管是鼠标还是键盘事件,它都会执行。所以按钮上加事件,尽量加活动监听。但是如果同时也加上Clicked事件,会发现Clicked先执行,鼠标点击事件会比活动监听事件活动得更具体一些。
双击动作的判断:
用这个方法,不仅双击动作,三击、四击...十击动作都可以判断。
08-GUI(键盘事件)
依然是为but这个按钮添加一个键盘事件。
KeyListener接口中的方法:
键盘监听事件:
但是键盘上的有的按键不只由一个字母组成,而是由许多字母组成,那么用上面的方法就只能获取第一个字符,接下来我们要获取该键的文本,即它的全部字符:
小功能,键盘按下Esc就结束:
但是27不好记,我们用它对应的常量值:
如果我们想监听ctrl+Enter呢?
在InputEvent类中,有这个方法,判断ctrl键是否被摁下:
OK, 这样写:
接下来我们想添加一个文本框,里面只能输数字:
写在键盘监听中:
09-GUI(练习-列出指定目录内容)
先把界面搭出来:
搭出来之后,我们发现界面很丑,下面做一些排版调整:
界面搭好了,接下来做功能,我们确定事件源为but,它同时操作这两个框框。
我们添加一个action监听,这样鼠标和键盘动作就都可以监听到。
因为功能涉及到了文件操作,所以头文件中一定要加入io包:
但是我们发现只显示了一个文件,原因是每次设置都会覆盖。于是我们将设置文本改成追加文本:
OK了:
10-GUI(对话框Dialog)
窗体的功能实现了,但是错误的提示还没有完成,以后这个窗体可能会被封装成一个可执行程序,就可以脱离控制台运行了。
依然在之前的基础上添加代码:
这个对话框很小,拉大之后发现确定按钮覆盖了整个窗体:
因为dialog默认的布局管理器也是边界布局,所以我们重新设置一下它的尺寸和布局方式:
把监听事件写好:
好了,接下来我们需要将错误信息显示在对话框上:
实现输入后按回车就可以显示目录:
11-GUI(菜单)
关于菜单的对象:
MenuBar 菜单栏 菜单条。
MenuBar中有添加菜单(Menu对象)的方法。
而Menu中又可以添加菜单项(MenuItem对象)。
Menu本身是MenuItem中的一员/子类:
话不多说,写代码:
效果:
给这个菜单中再添加一个子菜单:
注意:Menu可以添加MenuItem,也可以添加Menu。
添加事件监听:
12-GUI(练习-打开文件)
依然在之前的代码上做添加和改动,添加/改动的地方用红框框出来了:
界面搭好了:
下面我们想做一个打开的效果。
我们看一下FileDialog对象的方法:
代码:
效果:
下面添加文本显示区域:
(如果还是用流式布局界面会是下面这样,丑丑的):
添加的代码,添加文本区域:
边界布局效果就好看多了:
事件监听:
别忘记写上io包哦:
成功打开了:
13-GUI(练习-保存文件)
注意,如果该文件已存在,则点保存不会弹出对话框,如果该文件不存在,则点保存会弹出对话框。
代码:
该文件不存在,所以保存时会弹出对话框:
14-GUI(jar包双击执行)
我们刚刚写的这个java文件中有好多类:
类一多就要封装,怎么封装呢?找个包就好了。我们在代码中加入包,并且将类改成public型:
打个jar包:
但是发现jar包双击无法打开:
因为jar包中有很多类,它不知道该找哪个类打开。这时就需要我们告诉jar包哪个是带主函数的类,我们找到它执行就OK。
jar包中都有配置信息:
这个文件夹中有配置信息文件:
下面我们重新开始,删掉刚刚创建的jar包。新建一个txt文件,名字随便起,将配置清单的信息写在这个文件中:
重新打jar包:
打完包之后,我们再看配置信息文件,发现我们写的配置信息都写入了这个文件:
OK,双击jar包,打开了我们写的窗体,并且运行正常:
另, jar文件必须在本地注册过才能用,一般我们是双击安装的jdk,都会自动注册号,就像下面这样:
但是如果只是将jdk粘贴进电脑中,就需要我们自己注册。下面我们将它删掉,重新注册一遍:
OK了,图标变成了小树:
还有要注意一下配置信息的格式: