一、事件监听机制

-- 事件源: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. netcore的NLog使用小记

    1. 启动应用程序日志配置 修改Program.cs,在WebHostBuilder构建时配置日志 public static IWebHostBuilder CreateWebHostBuilder ...

  2. oracle 字符串分割函数

    首先创建一个类型: CREATE OR REPLACE TYPE str_split IS TABLE OF VARCHAR2 (4000); 创建函数: CREATE OR REPLACE FUNC ...

  3. 未能加载文件或程序集“System.Web.Http.WebHost, Version=4.0.0.0, ”或它的某一个依赖项。系统找不到指定的文件。

    第一次发布MVC项目,打开网站 未能加载文件或程序集“System.Web.Http.WebHost, Version=4.0.0.0, ”或它的某一个依赖项.系统找不到指定的文件. 问题原因:缺少配 ...

  4. MVC+Nhibernate+spring.net(一)

    所用数据库是我之前所写的Nhibernate入门篇的数据库https://www.cnblogs.com/pandorabox/p/PandoraBox.html 第一步:创建一个mvc项目 第二步: ...

  5. linux 的计划任务 定时任务

    linux的计划任务,也叫做定时任务 https://www.cnblogs.com/mingforyou/p/3930636.html 名字是crond 查看linux本机的定时任务 crontab ...

  6. BZOJ 2200--[Usaco2011 Jan]道路和航线(最短路&拓扑排序)

    2200: [Usaco2011 Jan]道路和航线 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1128  Solved: 414[Submit] ...

  7. jquery中ajax的几种方式

    三种简写: $.get(URL,data,function(data,status,xhr),dataType) $(selector).post(URL,data,function(data,sta ...

  8. iOS-button利用block封装按钮事件【runtime 关联】

    用block封装最常用的就是网络请求的回调,其实也可以结合category封装button的按钮事件,同时利用runtime的对象关联: UIButton+wkjButton.h 文件 #import ...

  9. 用开源 ASP.NET MVC 程序 Bonobo Git Server 搭建 Git 服务器(转)

    用开源 ASP.NET MVC 程序 Bonobo Git Server 搭建 Git 服务器   现在不用Git,都不好意思说自己是程序员. 当你想用Git,而源代码服务器是Windows系统时,你 ...

  10. 10分钟打造强大的gvim

    感谢Ruchee的共享精神,让我等vim新手省去了配置vim的麻烦(教程地址:配置文件使用指南). 只需要简单的6个步骤,就可以配置完成一个强大的gvim神器,下图是我的最终配置效果图. (另外,我的 ...