一、事件监听机制

-- 事件源: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. Aspose Word.Dll库自带的bug导致The document appears to be corrupted and cannot be loaded 问题处理。

    问题的详细描述: C#在开发过程中使用Aspose.word.dll库去实现word套打功能.但是,最近客户反映出现了一个问题,在打印文档的时候,系统报错.经过定位分析发现是Aspose.word.d ...

  2. Ocelot入门实践

    博主是第一次写技术文档,一是对这两年工作以来的一些技术和经验进行整理,二也是希望能和大家多多分享交流,如有写的不对的地方望大家多多指正.进入正题 Ocelot 概念就不说了,大家自行百度,今天做一个O ...

  3. WPF 斜角border

    最近看了一些科技感UI设计,其中很多的按钮都不是常见的圆角边,而是斜角边.查了一下,wpf中好像没有现成的斜角border,网上也没搜到现成的,于是自己写了点时间做了一个,写的较简单,有一些bug(主 ...

  4. UWP Background过渡动画

    首先说两件事: 1.大爆炸我还记着呢,先欠着吧... 2.博客搬家啦,新地址:https://blog.ultrabluefire.cn/ ==========下面是正文========== 前些日子 ...

  5. centos7----pstree

    centos 默认没有pstree 安装 yum -y install psmisc

  6. python实现音乐播放器

    python实现音乐播放器 模块:pygame 模块:time Python 布尔循环实例: import time import pygame muxi_k = """ ...

  7. Docker三剑客之常用命令

    一.docker-machine 命令 说明 docker-machine create 创建一个 Docker 主机(常用-d virtualbox) docker-machine ls 查看所有的 ...

  8. odoo开发环境搭建(三):安装odoo依赖的python包

    odoo开发环境搭建(三):安装odoo依赖的python包 http://www.cnblogs.com/jlzhou/p/5940815.html

  9. Unity学习系列一简介

    一.简介 Unity的目标是为了提升"依赖注入"的思想,去建立更加松耦合的系统.patterns & practices 小组在那个时候实现DI的方式和我们现在认为的DI有 ...

  10. Spring Boot打包war jar 部署tomcat

    概述 1.Spring Boot聚合工程打包war部署Tomcat 2.Spring Boot打包Jar,通过Java -jar直接运行. 3.提供完整pom.xml测试项目 至github 4.项目 ...