Java基础day22笔记:GUI概述|布局|Frame|事件监

2019-01-29  本文已影响0人  楠楠喜欢泡枸杞

    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了,图标变成了小树:

        还有要注意一下配置信息的格式:

上一篇下一篇

猜你喜欢

热点阅读