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; ...
随机推荐
- WPF 触摸屏小键盘样式
WPF程序,用于平板时,一些输入数量的地方我们需要弹出小键盘输入,这个键盘可以调系统的,也可以自己写. 分享个我现在用的一个数字键盘界面. <Window xmlns:dxe="htt ...
- python收集jvm数据
之前前辈用 java 写的收集 jvm 脚本, 不太方便组内小伙伴维护, 遂用 python 重写了 #!/usr/bin/env python # -*- coding: utf-8 -*- # F ...
- 调用notify()后,当前线程执行完synchronized块中的所有代码才会释放锁
package com.pinnet.test; public class Demo { public static void main(String[] args) { Demo demo = ne ...
- nginx官方文档 之 http负载均衡 学习笔记
一.负载均衡 算法 大致可以分两类: (1)不能保证用户的每一次请求都通过负载均衡到达同一服务器. (2)可保证用户的每一次请求都通过负载均衡到达同一服务器. 第二类的应用场景: 1.如果服务器有缓存 ...
- Mac下如何安装配置Homebrew
Last login: Mon Aug 7 13:57:29 on consolexiashenbindeMacBook-Pro:~ xiashenbin$ ruby -e "$(curl ...
- 手推SVM
推不动了,改日再更!
- (转)python类:magic魔术方法
原文:https://blog.csdn.net/pipisorry/article/details/50708812 版权声明:本文为博主皮皮http://blog.csdn.net/pipisor ...
- android开发学习——day6
关于UI的几个插件学习 button和textview,以及点击button利用Toast提醒,editText private EditText editText; @Override protec ...
- 使用binlog2sql针对mysql进行数据恢复
MySQL闪回原理与实战 DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据.此法 ...
- 世界上最短的bash脚本
世界上最短的bash脚本长这样: #!/bin/bash 为啥呢?见下图: 推荐一篇文章,讲解为啥shell脚本开头总是"#!/bin/bash".文风太清奇,不好翻译,看原文吧: ...