图形化界面编程:
其实所有的与电脑相关的操作都是编程操作,即人与电脑交互的方式体现的过程就是在编程;
主要的不同就是看封装了多少;封装的越多,操作起来就越简单,封装的越少,操作就越麻烦;没有封装的,图形化编程就做不了;
GUI 图形化界面
Graphical User Interface 图形用户接口 即Java提供的针对于图形化界面的公共组件;
操作更加方便直接;
CLI 命令行
Command Line User Interface 命令行用户接口;
这就需要记忆住很多的操作命令;
Java为GUI提供的对象都存在java.awt包和javax.swing包当中;
java.awt 这个包里面的特点都需要调用本地系统方法实现功能,即比较依赖于平台,在不同的平台下的图形会略有差异,属于重量级的控件;
java.swing 这个包是在awt的基础上,建立的一套界面系统,提供了更多的组件,而且完全由java实现,增强了移植性,属于轻量级的控件;
所以以后升级就升级swing包;
eclipse工具是纯java编写的,它是用swt界面的安装包编写的,是IBM的eclipse小组独立编写的图形化界面包;
1、swing的基本体系构成:
Component组件、构件;
Label是用来封装文字的组件对象,当文字不能放在组件上面,就用Label组件完成;
Window 窗体,窗口,
Frame 视窗,Panel面板
Container是一个特殊的组件,该组件中可以通过add方法添加其他组件进来;
使用的时候,都是创建的Frame的示例对象;
2、布局管理器
容器中的组件的排放方式,就是布局;
常见的布局管理器(布局对象)
玩图像界面,最麻烦的就是布局上;
组件默认都是居中的位置的;
(1)FlowLayout流式布局
(2)BorderLayout边界式布局,要先指定方向,否则就居中;即全部居中覆盖全部填充;
(3)GridLayout网格式布局
(4)GridBayLayout网格包式布局
(5)CardLayout卡片式布局
(6)坐标式布局,想放哪个位置就放哪里;
需要哪个布局管理器,就new哪个对象即可;
功能实现是比较简单的,最麻烦的就是图像化界面
一般图像化界面开发,最好使用高级编辑器如ecslipe等,里面都有画布,这样就方便多了;
面板panel的特点,可以将frame视窗进行分割;
3、awt包中的对象;
父类Component 里面超多方法;
子类 Container 容器组件
Component add(Component comp, intindex)
其实该类的底层是封装了集合对象,所以有脚标用来添加其他的组件对象
Frame对象 一般用该类实例化对象进行图像化界面操作;
原则依然是用父类方法,new子类实例
Frame实例化:
Frame() 构造一个最初不可见的 Frame 新实例()。
Frame(String title) 构造一个新的、最初不可见的、具有指定标题的 Frame 对象。
setVisible(boolean); 根据参数 b 的值显示或隐藏此组件。Component的方法;
主线程虽然结束了,但jvm程序还在运行没有结束,说明还有另外的前台线程在运行;
其实图形化界面是由另外线程在控制的,只要开启图像化界面就会多了一个线程;
设置视窗大小:setSize(int,int);横坐标,纵坐标
设置视窗相对位置:setLocation(int,int); 默认是左上角;
添加组件:
添加按钮:实例Button对象即可;
Button() 构造一个标签字符串为空的按钮。
Button(String label) 构造一个带指定标签的按钮。
Frame对象具备一个默认的布局管理器,叫做边界式布局;如果不指定位置就会居中全部填充;
设置布局管理:setLayout(LayoutManager mgr)
总结
创建图形化界面步骤:
(1)、创建Frame窗体;
(2)、对窗体进行基本设置,比如大小,位置,布局;
(3)、定义组件;
(4)、将组件通过窗体的add方法添加到窗体中;
(5)、让窗体显示,通过setVisible(true);
4、事件监听机制:
事件监听机制的特点:
(1)事件源(2)事件(3)监听器(4)事件处理;
事件源:就是awt包或者swing包中的那些图形界面组件;
事件:每一个事件源都有自己特有的对应事件和共性事件;
监听器:将可以出发某一个事件的动作(不只一个动作)都已经封装到了监听器中;
以上三者,在java中都已经定义好了,直接获取其对象就可以了,我们只需要对产生的动作进行处理即可;
监听器里面定义的都是动作;
抽象类java.awt.event.WindowAdapter中一个抽象方法都没有,目的就是为了不让实例化对象;
因为WindowListener的子类WindowAdapter已经实现了该接口,并覆盖了其中所有的方法,那么我们只需要继承子WindowAdapter覆盖我们需要的方法即可;
适配器的出现就是为了方便调用监听器对象;
常见动作:都可以使用匿名内部类来完成;
windowClosing(WindowEvent e) System.exit(0) ;
windowOpened(WindowEvent e)
windowActivated(WindowEvent e) 处于最前端的事件;
发现这些动作都是在动作发生时,底层就在动作发生的时候调用了该事件中的处理方法;
这个底层原理不是很明白;
为了优化整个程序,在awt程序中,要注意把事件处理和图像化界面分离开编程;
定义一个方法inits()把图像化界面放在这个方法里;
然后在定义一个方法myEvent()把所有的事件监听器都放在这个里面
而主函数时为了测试使用的;
setBounds(int ,int,int,int) 把Frame的位置和大小一起设置;
在添加监听器时,想要知道具备什么样的特有监听器,需要查看该组件对象的功能;
Frame addWindowListener(WindowListener) WindowsEvent
Button addActionListener(ActionListener) 按钮被活动
voidactionPerformed(ActionEvent e),
鼠标和键盘都可以使按钮活动;
ActionListener是少数几个没有子接口适配器的,因为他里的方法非常少,所以没必要;
一般超过三个方法的监听器接口,都是有实现类的;
共性的事情——在Component类中的监听器;
鼠标和键盘事件:
addMouseListener(MouseListener) MouseEvent
传入的监听器有多个方法,所以其有实现的适配器类
MouseEvent 中的getClickCount()获取鼠标单击次数;
addKeyListener(KeyListener) KeyEvent
在java.awt.event包中,除了监听器就是事件对象;
KeyEvent 中的方法getKeyChar() 方法getKeyCode() 静态方法getKeyText();
组合键isControlDown();
TextFiled类,只有一列;
consume(),让键盘事件不按默认的方式产生输入源代码来处理该事件;
按钮上面显示有虚线框,那么就表示该按钮就是当前事件源;
练习:
在文本框中输入目录,点击赚到按钮,将该目录中的文件与文件夹名称列在下面的文本区域中;
在做图形化界面中,首先画的第一步都是界面;画完之后再加事件;
可以用继承Frame类的方法来画界面;
把画界面的组件都封装到一个方法里面,后面如果有需要可以进行覆盖;
TextFiled 文本框,只有列
TextArea 文本区域,
setVisible()可视化一般放在最后;
主函数一般时用来测试使用的;
getText()
TextComponent的方法setText() 将文本数据添加到组件中;set的方法都是覆盖;
TextArea的方法 append(String) 追加文本;在文本后面追加;
事件,监听机制;这就是上面图形化界面最基本的动作和功能;
5、错误处理方式;
用对话框进行处理;
Dialog也是一个窗体; 默认时是还可以操作后面的窗体的;要设置为true才行;
对话框一般不单独存在,一般是发生了一些事情后才跳出来;所以对话框要依赖于窗体;
一般的,优化程序,只有当错误产生了才出现对话框,这样节约内存;
对话框一般两个组件,文字和按钮;
只有Lable对象才能封装文本,其他组件时不能封装文本的;
窗体定义完之后,只有setVisible(true)才能显示;其实窗体都是在内存中一直都有的,只是没有显示;当不显示时,该窗口就不存在图形化了,所以操作就没效,因为不可见就没有操作反应;
这个窗体也是默认的流式布局;
图像化界面需要new的对象非常多,所以一般运行会有点小慢;
6、菜单
MenuBar 菜单栏
Menu 为菜单
MenuItem 菜单项;
add()
addActionListener(ActionListener l)
练习:打开保存对话框;
FileDialog 两个模式FileDialog.LOAD 或 FileDialog.SAVE 默认的模式是load模式;
默认布局就是边界布局,即全部填充;
7、jar命令;
jar –cvf jar包的名称,包名;
配置清单信息;
Main-Class:写上主类名称的固定格式,前面要加一个空格,别忘了后面要加一个回车;
空格和回车必须都要有;
可执行文件要配置注册文件;
javass:
组件放在panel上,panel放在Frame上,最后设置显示;
setLayOut(null);不要默认的布局;
字体,大小,颜色,位置,组件主要的属性;
类Canvas画布, paint方法;
Canvas其实也是一个组件;一般用子类继承,重写里面的paint方法;
注意,所有的组件必须要添加到Frame容器组件中才可以显示得出来;
Window类的方法 pack()和setVisible()效果一样,即显示功能;;
获取组件的大小设置值getInsets()
滚动条组件ScrollPane类,放在panel里面的;
画Panel的基本构成
(1)需要出现在界面上的组件的定义;
(2)界面初始化的方法;
(3)界面事件处理的方法;