Java基础——GUI编程(二)
一、事件监听机制
-- 事件源: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编程(二)的更多相关文章
- java基础—GUI编程(二)
一.事件监听
- java基础—GUI编程(一)
一.AWT介绍
- Java基础——GUI编程(四)
继前面的,这篇主要记录菜单和文件对话框的两个小练习,来熟悉一下方法的应用,一些简单的逻辑和Swing的相关简介,以及关于GUI基础的记录. 一.创建一个菜单 import java.awt.FlowL ...
- Java基础——GUI编程(一)
一.定义 GUI全称是Graphical User Interface,即图形用户界面.JDK中提供了AWT 和 Swing 两个包,用于GUI程序的设计和开发. 1.java .awt abstr ...
- Java基础——GUI编程(三)
接着前两篇学习笔记,这篇主要介绍布局管理器和对话框两部分内容. 一.布局管理器 先拿一个小例子来引出话题,就按照我们随意的添加两个按钮来说,会产生什么样的效果,看执行结果. import java.a ...
- java GUI编程二
java基础学习总结--GUI编程(二) 一.事件监听 测试代码一: 1 package cn.javastudy.summary; 2 3 import java.awt.*; 4 import j ...
- 【Java】GUI编程
GUI编程 前言 某koukou老师的任务罢了,好在狂神老师居然有GUI的课,只能说是有救星了. [狂神说Java]GUI编程入门到游戏实战 最好笑的是,老师要求掌握的居然是14年的知识,就连狂神在上 ...
- 1.JAVA之GUI编程概述
下列内容为本人看毕向东老师java视频教程学习笔记! JAVA GUI图形用户界面编程: Windows 操作系统提供两种操作方式: ...
- 10.JAVA之GUI编程弹出对话框Dialog
在上节基础上添加对话框显示错误信息. 代码如下: /*弹出对话框显示错误信息,对话框一般不单独出现,一般依赖于窗体.*/ /*练习-列出指定目录内容*/ import java.awt.Button; ...
随机推荐
- netcore的NLog使用小记
1. 启动应用程序日志配置 修改Program.cs,在WebHostBuilder构建时配置日志 public static IWebHostBuilder CreateWebHostBuilder ...
- oracle 字符串分割函数
首先创建一个类型: CREATE OR REPLACE TYPE str_split IS TABLE OF VARCHAR2 (4000); 创建函数: CREATE OR REPLACE FUNC ...
- 未能加载文件或程序集“System.Web.Http.WebHost, Version=4.0.0.0, ”或它的某一个依赖项。系统找不到指定的文件。
第一次发布MVC项目,打开网站 未能加载文件或程序集“System.Web.Http.WebHost, Version=4.0.0.0, ”或它的某一个依赖项.系统找不到指定的文件. 问题原因:缺少配 ...
- MVC+Nhibernate+spring.net(一)
所用数据库是我之前所写的Nhibernate入门篇的数据库https://www.cnblogs.com/pandorabox/p/PandoraBox.html 第一步:创建一个mvc项目 第二步: ...
- linux 的计划任务 定时任务
linux的计划任务,也叫做定时任务 https://www.cnblogs.com/mingforyou/p/3930636.html 名字是crond 查看linux本机的定时任务 crontab ...
- BZOJ 2200--[Usaco2011 Jan]道路和航线(最短路&拓扑排序)
2200: [Usaco2011 Jan]道路和航线 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1128 Solved: 414[Submit] ...
- jquery中ajax的几种方式
三种简写: $.get(URL,data,function(data,status,xhr),dataType) $(selector).post(URL,data,function(data,sta ...
- iOS-button利用block封装按钮事件【runtime 关联】
用block封装最常用的就是网络请求的回调,其实也可以结合category封装button的按钮事件,同时利用runtime的对象关联: UIButton+wkjButton.h 文件 #import ...
- 用开源 ASP.NET MVC 程序 Bonobo Git Server 搭建 Git 服务器(转)
用开源 ASP.NET MVC 程序 Bonobo Git Server 搭建 Git 服务器 现在不用Git,都不好意思说自己是程序员. 当你想用Git,而源代码服务器是Windows系统时,你 ...
- 10分钟打造强大的gvim
感谢Ruchee的共享精神,让我等vim新手省去了配置vim的麻烦(教程地址:配置文件使用指南). 只需要简单的6个步骤,就可以配置完成一个强大的gvim神器,下图是我的最终配置效果图. (另外,我的 ...