/*
* 如果想要关闭窗口,就需要通过事件处理机制对窗口进行监听
* 事件处理机制专门用于响应用户的操作,例如想要响应用户的单击鼠标等操作
* 事件对象:封装了GUI组件上发生的特定事件(通常就是用户的一次操作)
* 事件源:事件发生的场所,就是产生事件的组件
* 监听源:负责监听事件源上发生的事,并对各种事件作出相应处理的对象(对象中包含事件处理器)
* 事件处理器:监听器对象对接受的事件对象进行相应处理的方法
*/
/*
* 在程序中如果想实现事件的监听机制,则先定义一个实现了事件监听器的类,如Window类型的窗口需要实现WindowListener。
* 接着通过addWindowListener()方法为事件源注册事件监听器对象,当事件源上发生事件时,
* 便会触发事件监听器对象,由事件监听器调用相应的方法来处理相应的事件
*/
public class AWTHuiTu{
public static void main(String[] args) {
Frame f = new Frame("验证码");
MyPanel mp = new MyPanel();
f.add(mp);
f.setSize(200, 100);
// 窗口位置设置为空,即默认居中
f.setLocationRelativeTo(null);
f.setVisible(true);
// 创建WindowListener实例对象,监听窗体事件
My4WindowListener mw = new My4WindowListener();
f.addWindowListener(mw);
}
}
class MyPanel extends Panel {
public void paint(Graphics g) {
int width = 160;// 设置验证码图片宽度
int height = 40;// 设置验证码图片高度
g.setColor(Color.LIGHT_GRAY);// 设置上下文颜色
g.fillRect(0, 0, width, height);// 填充验证码背景
g.setColor(Color.BLACK);// 设置上下文颜色
g.drawRect(0, 0, width - 1, height - 1);// 绘制边框
//绘制干扰点
Random r = new Random();
for (int i = 0; i < 100; i++) {
int x = r.nextInt(width) - 2;
int y = r.nextInt(height) - 2;
g.drawOval(x, y, 2, 2);
}
//设置验证码字体
g.setFont(new Font("黑体", Font.BOLD, 30));
g.setColor(Color.BLUE);// 设置验证码颜色
//产生随机验证码
char[] chars = ("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ").toCharArray();
//创建字符串缓冲区对象
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 4; i++) {
int pos = r.nextInt(chars.length);
char c = chars[pos];
sb.append(c + " ");
}
g.drawString(sb.toString(), 20, 30);// 写入验证码
}
}
//创建WindowListener类实现WindowListener接口
class My4WindowListener implements WindowListener{
// 监听器监听事件对象作出处理
public void windowClosing(WindowEvent e) {
Window wd = e.getWindow();
wd.setVisible(true);
System.out.println("windowClosing窗体正在关闭事件");
//释放窗体
wd.dispose();
}
@Override
public void windowActivated(WindowEvent arg0) {
System.out.println("windowActivated窗体激活事件");
}
@Override
public void windowClosed(WindowEvent arg0) {
System.out.println("windowClosed窗体关闭事件");
}
@Override
public void windowDeactivated(WindowEvent arg0) {
System.out.println("windowDeactivated窗体停用事件");
}
@Override
public void windowDeiconified(WindowEvent arg0) {
System.out.println("windowDeiconified窗体取消图标化事件");
}
@Override
public void windowIconified(WindowEvent arg0) {
System.out.println("windowIconified窗体图标化事件");
}
@Override
public void windowOpened(WindowEvent arg0) {
System.out.println("windowOpened窗体打开事件");
}
}
如有不懂可私聊,如有更好的逻辑方式,可再评论区留言,请指教