一、事件监听机制

-- 事件源:awt 或swing包中的那些图形界面组件,即发生事件的组件

-- 事件:Event  用户对组件的一个操作

-- 监听器:Listener  负责处理事件的方法

二、java.awt.event 包下的类

WindowEvent  //窗口事件,比如用户点了半闭窗口,窗口得到或失去焦点,最大化最小化等

MouseEvent  //鼠标事件,鼠标按下,鼠标释放,点击(按下后再松开)等

ActionEvent  //动作事件,它不是代表一个具体动作,而是一种语义,比如按纽,或菜单被点击,在文本框中按下回车等,可以这样理解:用户的某一动作导致了某个组件本身的基本作用发生了,这就是ActionEvent事件

不同的事件类型,对应着不同的事件监听器接口,接口的名称和事件的名称是相对应的。

WindowEvent - >WindowListener

MouseEvent ->MouseListener

ActionEvent ->ActionListener

代码示例:

import java.awt.Frame;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener; public class Test20 {
public static void main(String[] args) {
Frame f = new Frame();
f.setSize(400, 400);
f.setVisible(true); f.addWindowListener(new WindowListener() { @Override
public void windowOpened(WindowEvent e) { // 窗口被打开
// TODO Auto-generated method stub } @Override
public void windowClosing(WindowEvent e) { // 设置关闭事件
// TODO Auto-generated method stub
System.exit(0);
} @Override
public void windowClosed(WindowEvent e) { // 用户已经关闭窗口
// TODO Auto-generated method stub } @Override
public void windowIconified(WindowEvent e) { // 被最小化的时候
// TODO Auto-generated method stub } @Override
public void windowDeiconified(WindowEvent e) { // 最小化被还原的时候
// TODO Auto-generated method stub } @Override
public void windowActivated(WindowEvent e) { // 窗体被激活
// TODO Auto-generated method stub } @Override
public void windowDeactivated(WindowEvent e) { // 失去焦点的时候
// TODO Auto-generated method stub } });
}
}

有没有发现,用WindowListener接口的时候,会引入一大堆不常用的代码(这里我们只想设置关闭),借口里的方法只能被覆盖,又不能删掉,这样就是的整个项目显得很罗嗦,为了解决这个事情,就有了事件适配器。

三、事件适配器

JDK 针对大多数事件监听器接口类定义了相应的实现类(里面有很多空实现的方法,方便我们创建侦听器对象),我们称为事件适配器类。这里我用到了WindowAdapter。

import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; public class Test21 {
public static void main(String[] args) {
Frame f = new Frame("事件适配器的栗子");
f.setSize(400, 400);
f.setVisible(true); f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}

可以观察一下WindowAdapter类的源码,找找感觉。

public abstract class WindowAdapter
implements WindowListener, WindowStateListener, WindowFocusListener
{
/**
* Invoked when a window has been opened.
*/
public void windowOpened(WindowEvent e) {} /**
* Invoked when a window is in the process of being closed.
* The close operation can be overridden at this point.
*/
public void windowClosing(WindowEvent e) {} /**
* Invoked when a window has been closed.
*/
public void windowClosed(WindowEvent e) {} /**
* Invoked when a window is iconified.
*/
public void windowIconified(WindowEvent e) {} /**
* Invoked when a window is de-iconified.
*/
public void windowDeiconified(WindowEvent e) {} /**
* Invoked when a window is activated.
*/
public void windowActivated(WindowEvent e) {} /**
* Invoked when a window is de-activated.
*/
public void windowDeactivated(WindowEvent e) {} /**
* Invoked when a window state is changed.
* @since 1.4
*/
public void windowStateChanged(WindowEvent e) {} /**
* Invoked when the Window is set to be the focused Window, which means
* that the Window, or one of its subcomponents, will receive keyboard
* events.
*
* @since 1.4
*/
public void windowGainedFocus(WindowEvent e) {} /**
* Invoked when the Window is no longer the focused Window, which means
* that keyboard events will no longer be delivered to the Window or any of
* its subcomponents.
*
* @since 1.4
*/
public void windowLostFocus(WindowEvent e) {}
}

练习几个个事件处理程序的栗子吧。

例一:

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; //例一:在窗体中放置一个按纽,点击后让程序退出
class TestFrame implements ActionListener { // ActionListener接口里面只有一个方法,下面会重写
private Frame f; public TestFrame() {
f = new Frame("窗口");
init();
} private void init() {
f.setSize(300, 300);
f.setLayout(new FlowLayout());// 布局模式
Button b = new Button("退出程序");
b.addActionListener(this);
f.add(b);
f.setVisible(true); } @Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
f.setVisible(false);
f.dispose();// 在关闭的时候,可以用它来销毁窗体资源
System.exit(0);// 退出
} } public class Test22 {
public static void main(String[] args) {
new TestFrame();
} }

上面的,点击退出程序按钮才可以退出,点击右上角的X,是不可以退出的哦。因为没有设置WindowListener哦。

这个例子用到ActionListener接口,可以看一下它的源代码,如下:

public interface ActionListener extends EventListener {

    /**
* Invoked when an action occurs.
*/
public void actionPerformed(ActionEvent e); }

例二:

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; //在窗体中,放置一个文本框,能过滤非法字符( 除了数字以外的 )
public class TestFrame {
private Frame f;
private TextField txtNo;// TextField代表文本框 public TestFrame() {
f = new Frame("请输入密码"); //f.setBackground(red);这里我自己试的, 没成功
f.setBackground(Color.red);//这样就可以了
f.setBounds(50, 50, 400, 400);// 设置窗口坐标和大小
f.setLayout(new FlowLayout());// 设置窗体布局 txtNo = new TextField(10);// 设置输入窗口的显示长度。输入的内容长度没有界限
f.add(txtNo); txtNo.addKeyListener(new KeyAdapter() {
// 从JDk中粘贴过来这个方法来用
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if (!(code >= KeyEvent.VK_0 && code <= KeyEvent.VK_9)) {// 设置输入内容为0-9
System.out.println(KeyEvent.getKeyText(code) + "输入有误");
e.consume();
}
}
}); f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
f.dispose();
System.exit(0);
}
}); }
}

测试类:

public class Test23 {
public static void main(String[] args) {
new TestFrame();
}
}

例三:

列出指定目录的内容:

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File; public class Test24 {
public static void main(String[] args) {
new MyWindow();
}
} class MyWindow {
MyWindow() {
init();
} private Frame f;
private Button b;
private TextField txtDir;// 用来输入目录名称
private TextArea txtFileList;// 用来显示文件列表 private void init() {
f = new Frame("窗口");
f.setBounds(44, 44, 500, 500);
f.setLayout(new FlowLayout()); txtDir = new TextField(8);
b = new Button("显示");
txtFileList = new TextArea(20, 30);// 用来显示文件列表的区域 f.add(txtDir);
f.add(b);
f.add(txtFileList);
initEvent();
f.setVisible(true);
} private void initEvent() {
// TODO Auto-generated method stub
f.addWindowListener(new WindowAdapter() {
/**
* Invoked when a window is in the process of being closed. The
* close operation can be overridden at this point.
*/
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
b.addActionListener(new ActionListener() {
/**
* Invoked when an action occurs.
*/
public void actionPerformed(ActionEvent e) {
txtFileList.setText("");
String dirStr = txtDir.getText();// 取出用户输入的路径
File file = new File(dirStr);
if (file.isDirectory() && file.exists()) {
String[] fileNameList = file.list(); for (String s : fileNameList) {
txtFileList.append(s + "\r\n");// 别忘了换行符
}
} else {
txtFileList.append("输入有误,请重新输入");
}
}
}); }
}

结果:(我让它显示我D盘的目录)

Java基础——GUI编程(二)的更多相关文章

  1. java基础—GUI编程(二)

    一.事件监听

  2. java基础—GUI编程(一)

    一.AWT介绍

  3. Java基础——GUI编程(四)

    继前面的,这篇主要记录菜单和文件对话框的两个小练习,来熟悉一下方法的应用,一些简单的逻辑和Swing的相关简介,以及关于GUI基础的记录. 一.创建一个菜单 import java.awt.FlowL ...

  4. Java基础——GUI编程(一)

    一.定义 GUI全称是Graphical User Interface,即图形用户界面.JDK中提供了AWT 和 Swing 两个包,用于GUI程序的设计和开发. 1.java .awt  abstr ...

  5. Java基础——GUI编程(三)

    接着前两篇学习笔记,这篇主要介绍布局管理器和对话框两部分内容. 一.布局管理器 先拿一个小例子来引出话题,就按照我们随意的添加两个按钮来说,会产生什么样的效果,看执行结果. import java.a ...

  6. java GUI编程二

    java基础学习总结--GUI编程(二) 一.事件监听 测试代码一: 1 package cn.javastudy.summary; 2 3 import java.awt.*; 4 import j ...

  7. 【Java】GUI编程

    GUI编程 前言 某koukou老师的任务罢了,好在狂神老师居然有GUI的课,只能说是有救星了. [狂神说Java]GUI编程入门到游戏实战 最好笑的是,老师要求掌握的居然是14年的知识,就连狂神在上 ...

  8. 1.JAVA之GUI编程概述

          下列内容为本人看毕向东老师java视频教程学习笔记! JAVA GUI图形用户界面编程: Windows 操作系统提供两种操作方式:                             ...

  9. 10.JAVA之GUI编程弹出对话框Dialog

    在上节基础上添加对话框显示错误信息. 代码如下: /*弹出对话框显示错误信息,对话框一般不单独出现,一般依赖于窗体.*/ /*练习-列出指定目录内容*/ import java.awt.Button; ...

随机推荐

  1. urllib2 的get请求与post请求

    urllib2默认只支持HTTP/HTTPS的GET和POST方法 urllib.urlencode() urllib和urllib2都是接受URL请求的相关参数,但是提供了不同的功能.两个最显著的不 ...

  2. shapefile的使用和地理信息的获得

    Shapefile文件是美国ESRI公司发布的文件格式,因其ArcGIS软件的推广而得到了普遍的使用,是现在GIS领域使用最为广泛的矢量数据格式.官方称Shapefile是一种用于存储地理要素的几何位 ...

  3. java 路径的问题

    在项目开发中会碰到各种各样的获取项目路径的一些问题: 1:java项目: 以获取  类路径下的mess.properties 为例来说明: 文件在项目中的位置: src/bz/beppe/demo/r ...

  4. Nginx 负载均衡和反向代理实践

    nginx 以哪个配置文件启动 Nginx 负载均衡和反向代理实践 环境介绍 192.168.1.50    在这台主机上配置Nginx 的反向代理,负载均衡,和web1,web1使用的81号端口 1 ...

  5. mybatis 控制台打印执行的SQL语句

    1. Spring boot 集成 mybatis [转载]SpringBoot中Mybatis打印sql 1.1 如果使用的是application.properties文件,加入如下配置: log ...

  6. 用mac的safari浏览器调试ios手机的网页

    iOS 6给Safari带来了远程的Web检查器工具. 一.参考链接 ios开发者文档 safari开发者工具 remote debugging safari 二.设置iphone 设置 -> ...

  7. odoo开发笔记 -- wkhtmltox打印不显示中文 --ubuntu字体安装

    wkhtmltox 是一个开源的将网页内容转换成PDF的软件包,常嵌套在网页页面里边做打印功能. 以微软雅黑字体为例(其他的宋体.黑体等点阵字体都一样的),我们的雅黑字体文件是:Yahei.ttf(放 ...

  8. (转)linux用户态和内核态理解

    原文:https://blog.csdn.net/buptapple/article/details/21454167 Linux探秘之用户态与内核态-----------https://www.cn ...

  9. idea terminal 修改为git bash 不支持中文

    1.idea terminal 修改为git bash 由于IDEA自带的Terminal工具是Windows命令窗口cmd,在开发过程中需要用到一些常用的命令操作时要不断的在IDEA和git bas ...

  10. Vue笔记:使用 mock.js 模拟数据

    在我们的项目实际开发过程中,后端的接口往往是较晚才会提供出来,并且还要写接口文档,如果前端的开发都要等到接口开发完成才开始就非常影响项目整体开发进度了,mock.js 的出现使前后端分离并行开发成为可 ...