GUI/图形用户界面
AWT的基础知识
GUI全称是图形用户界面,分成两大类:基本组件(java.awt.componnent)不能放置组件和容器(java.awt.container)可以放置按钮等组件
程序的GUI部分由AWT线程管理(dispose这个方法是将线程释放,将运行程序从内存中清除掉)
AWT事件处理
事件:用户对组件的一个操作称之为一个事件;
事件源:发生事件的组件就是事件源;调用者
事件处理器:某个java类中的负责处理事件的成员方法。
事件分类
按产生事件的物理操作和GUI组件的表现效果进行分类:
MouseEvent
WindowEvent
ActionEvent //用户的物理操作导致某个组件本身的基本作用发生
事件的性质分类:1低级事件【多个成员方法称为低级事件】
2语义事件【监听器中只有一个方法就是语义事件】(关心动作发生不关心怎么发生)【又称为高级事件】
事件监听器(方法都是void类的)
一个事件监听器对象负责处理一类事件
一类事件的每一种发生情况,分别由事件监听器对象中的一个方法来具体处理。
在事件源和事件监听器对象中进行约定的接口类,被称为事件监听器接口。
事件监听器接口类的名称与事件类的名称是相对应的。
TestFrame.java import java.awt.*;
public class TestFrame{
public static void main(String[] args){
Frame f = new Frame("www.sina.com.cn");
f.add(new Button("ok"));
f.setSize(300,300);
f.setVisible(true);
f.addWindowListener(new MyWindowListener()); //注册监听器
try{
Thread.sleep(5000);
}catch(Exception e){
}
//f.setVisible(false); //隐藏窗口
f.dispose(); //清除窗口
}
}
//MyWindowListener.java //事件监听器类 (有七个方法)
import java.awt.event.WindowListener;
import java.awt.event.WindowEvent;
import java.awt.Window;
public class MyWindowListener implement WindowListener {
public void windowOpened(WindowEvent parm1){
}
public void windowClosing(WindowEvent parm1){ //Closing正想关闭窗口
parm1.getWindow().setVisible(false);
//parm1.getSource() //getSource方法返回发生事件的来源
((Window)parm1.getComponent()).dispose(); //getComponent方法返回发生事件的组件
System.exit(0); //退出程序 }
public void windowClosed(WindowEvent parm1){ //Closed已经关闭窗口 }
public void windowIconified(WindowEvent parm1){}
public void windowDeiconified(WindowEvent parm1){ }
public void windowActivated(WindowEvent parm1){ }
public void windowDeactivated(WindowEvent parm1){ }}
事件适配器:简化事件监听器编写
使用事件适配器时的常见问题,解决问题的思路:
-- 是方法没有被调用 ,还是方法中的程序代码的执行问题?
-- 是方法名写错了,还是没有注册事件监听器?
事件适配器类的不足之处.JAVA中不允许一个类同时继承两个类,如果想用做事件监听器的类已经继承了别的类,它就不能再继承适配器类,在这种情况下我们就只能使用事件监听器接口.
灵活设计事件监听器类
如果要在事件监听器类中访问非事件源的其他的GUI组件,程序该如何编写?
事件处理的多重运用
1.一个事件监听器对象可以注册多个事件源
2.在一个事件源上也可以注册对同一类事件进行处理的多个事件监听器对象
3.如何知道一个GUI组件倒底能够触发哪几种事件?
4.一个组件上的一个动作可以产生多种不同类型的事件
修改组件的默认事件处理方式
1.只有在一个组件上注册了某种事件的事件监听器对象后,组件才会产生相应的事件对象
2.默认的prosessEvent方法调用相应的processXXXEvent方法
如果只是想改变其中的几个事件的处理方式,就要覆盖那几个事件的方法,由于不能进入到某个主件processXXXEvent中修改程序代码,只有建立一个继承主件的子类,在子类中覆盖方法,并用子类创建对象。
3.调用enableEvents((long eventsToEnable))方法,可以在即使没有注册事件监听器的情况下,组件也能够对某些类型的事件进行响应和产生相应的事件对象.
4.
mainFrame.setVisible(true);
btn2.setVisible(false);不能够顺序颠倒因为在主窗口显示出来前,加在上面的主件是不可显示状态,就不能调用setVisable();
GUI组件上的图形操作
GUI组件上的图形操作
Graphics类与图形绘制
组件重绘的处理
图像显示
双缓冲技术
Graphics类与图形绘制
Component.getGraphics方法与Graphics类.
Graphics.drawLine(int x1,int y2,int x2,int y2)方法
Graphics.drawString(String str,int x,int y)方法文本显示在主件上
Graphics.drawString方法的坐标参数(左下角的坐标不是左上角)
,是连字符;Vector是存储对象的集合类。
图像显示(方法要在PAINT方法里面写保证在最小化的时候恢复还有图像)
图像显示
使用Graphics.drawImage(Image img,int x,int y,ImageObserver observer)方法显示图像。
(Observer 监视图像创建对象生成的进度;创建IMAGE对象的时候并没有完全装载到内存,DRAWIMAGE方法也会返回,创建Image内对象的时候,并没有在图像内存中创建数据,只是在需要的时候才去加载图像所需要的数据;如果Image数据中没有数据的时候,在调用DRAWIMAGE方法的时候,就会在内存中创建数据
使用Component.getToolkit.getImage(String path)语句获得Image实例对象。
空指针异常信息都应该想到对象为null时还要调用它的成员方法或成员属性
窗口显现是图像没有显现一是指定图像的路径不对而是根本不存在这样的图像文件。此时应该进入图像所在的目录查看图像是否存在。
双缓冲技术
步骤:Component.createImage方法创建内存Image对象。
在Image对象上进行绘制的结果就成了一幅图像
在Image对象上执行与组件表面同样的绘制,Image对象中的图像是组件表面内容的复制,当组件重画时,只需将内存中的Image对象在组件上画出。
在窗口第一次显示的时候会调用PAINT方法,而IMAGE的实例对象还没有创建出来,而VISIBLE在paint方法之后调用会出现空指针出错所以要先检测
常用的AWT组件
JAVA的图形用户界面最基本的组成部分就是组件,组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象(按钮,标签等),抽象类Component是所有GUI组件的父类,Component类规定了GUI组件的基本特性,这个类中定义的方法实现了作为一个GUI组件所应具有功能;另外还有一个叫做MenuComponent的类,它是用于菜单方面的父类,菜单方面的组件都是MenuComponent的子类.
Canvas
Canvas是具有最基本和最简单的GUI功能的组件.
Canvas代表屏幕上的一块空白的矩形区域,程序能够在这个部件表面绘图,也能够捕获用户的操作,产生相应的事件.
当要设计自定制的具有GUI功能的组件类时,继承Canvas将会大大简化编程难度,只需要实现主件特有的外观和功能的代码就可以了。在JAVA中定义自定制的组件外观,可以覆盖CANVAS类中的paint和update方法。
菜单
一个完整的菜单系统由菜单条,菜单,和菜单项组成
JAVA中与菜单相关的类主要有:MenuBar(菜单条),Menu(菜单),MenuItem(菜单项)
具有复选标记的菜单项使用CheckboxMenuItem来定义
有子菜单的菜单选:其实一个menuitem类是menu的子类,此时用menu来定义然后将其子类有menuitem加载进去,并且要对子菜单的内容进行检测(新建一的工作间)(监听器对动作进行监测)还需要将实例对象加入到相应的事件源中去,如果是一个以上的事件源要处理此时就使用时在事件源中建立一个事件源的实例对象,然后将实例对象加载到事件源的监听器中
对于能够发出actionListener事件的主件都能够调用setActionCommand方法
setActionCommand方法的作用.该方法可以为组件关联一个命令字符串,用于指示组件的动作想要执行的命令.不用setActionCommand为组件关联一个命令字符串时,默认的命令字符串为菜单组件的标题文本.用getActionCommand可以返回命令字符串.
(主件不能独立显现出来此时需要容器类帮助)
Container
是所有容器类的父类,Container.add方法用于将组件添加到容器中.(Frame就是其中一种容器)
Container也是Component的子类,容器类对象本身就是一个主件,具有主件所有性质,因此也可以作为组件增加到其它容器上.
Dialog与FileDialog类
Dialog类用于产生对话框(与框架窗口类似,可以添加其他的主件但是对话框没有菜单条不能改变大小,一般用于临时显示的窗口,用于显示提示信息或则接收用户的输入。不能独立存在必须要有一个上级窗口,上级窗口就是对话框的拥有者)
对话框的分类:1.模态对话框(显示时不能在其他对话窗口操作,只有关闭后才能操作
2.非模态对话框(显示时可以操作其他框架如记事本)
Dialog类的两个常用构造方法:
-- public Dialog(Frame owner,String title);默认的是非模态对话框
-- public Dialog(Frame owner,String title,boolean modal); //modal参数用于设定模式(模态,非模态)
如果方法中有个对象x,内部类中有个对象x,,外部类中有个对象x,现在在方法中如何访问对象,内部类用this外部类用方法名加this
FileDialog类是Dialog类的一个子类,能够产生标准的文件存取对话框:保存文件和打开文件对话框只能在普通文本中应用