Java进阶09 事件响应
在GUI中,我们看到了如何用图形树来组织一个图形界面。然而,这样的图形界面是静态的。我们无法互动的对该界面进行操作。GUI的图形元素需要增加事件响应(event handling),才能得到一个动态的图形化界面。
元素, 事件, 监听器
我们在GUI一文中提到了许多图形元素。有一些事件(Event)可能发生在这些图形元素上,比如:
- 点击按钮
- 拖动滚动条
- 选择菜单
Java中的事件使用对象表示,比如ActionEvent。每个事件有作用的图形对象,比如按钮,滚动条,菜单。
所谓互动的GUI,是指当上面事件发生时,会有相应的动作产生,比如:
- 改变颜色
- 改变窗口内容
- 弹出菜单
每个动作都针对一个事件。我们将动作放在一个监听器(ActionListener)中,然后让监听器监视(某个图形对象)的事件。当事件发生时,监听器中的动作随之发生。
因此,一个响应式的GUI是图形对象、事件对象、监听对象三者互动的结果。我们已经知道了如何创建图形对象。我们需要给图形对象增加监听器,并让监听器捕捉事件。
按钮响应
下面实现一个响应式的按钮。在点击按钮之后,面板的颜色会改变,如下图:
(这个例子改编自Core Java 2,Volume 1, Example 8-1)
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class HelloWorldSwing {
private static void createAndShowGUI() {
JFrame frame = new JFrame("HelloWorld");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Pane's layout
Container cp = frame.getContentPane();
cp.setLayout(new FlowLayout());
// add interactive panel to Content Pane
cp.add(new ButtonPanel());
// show the window
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
Runnable tr = new Runnable() {
public void run() {
createAndShowGUI();
}
};
javax.swing.SwingUtilities.invokeLater(tr);
}
}
/**
* JPanel with Event Handling
*/
class ButtonPanel extends JPanel
{
public ButtonPanel()
{
JButton yellowButton = new JButton("Yellow");
JButton redButton = new JButton("Red");
this.add(yellowButton);
this.add(redButton);
/**
* register ActionListeners
*/
ColorAction yellowAction = new ColorAction(Color.yellow);
ColorAction redAction = new ColorAction(Color.red);
yellowButton.addActionListener(yellowAction);
redButton.addActionListener(redAction);
}
/**
* ActionListener as an inner class
*/
private class ColorAction implements ActionListener
{
public ColorAction(Color c)
{
backgroundColor = c;
}
/**
* Actions
*/
public void actionPerformed(ActionEvent event)
{
setBackground(backgroundColor); // outer object, JPanel method
repaint();
}
private Color backgroundColor;
}
}
上面,我们用一个内部类ColorAction来实施ActionListener接口。这样做是为了让监听器能更方便的调用图形对象的成员,比如setBackground()方法。
ActionListener的actionPerformed()方法必须被覆盖。该方法包含了事件的对应动作。该方法的参数为事件对象,即监听ActionEvent类型的事件。ActionEvent是一个高层的类,Java会找到图形对象(按钮)会发生的典型事件(点击)作为事件。
ColorAction生成的对象即为监听器对象。
我们为两个按钮JButton添加了相应的监听器对象。当有事件发生时,对应动作将随之产生。
总结
ActionListener interface
ActionEvent class
- 设计模式之状态模式
- PDF.NET数据开发框架实体类操作实例(for PostgreSQL,并且解决自增问题) PDF.NET数据开发框架实体类操作实例(MySQL)
- 设计模式之代理模式
- 续谈ActiveMQ之java如何操作ActiveMQ(springBoot项目)
- 深入理解JVM原理之编译openjdk7
- 初识ActiveMQ
- Kafka集群安装
- 知其所以然之永不遗忘的算法
- ZOOKEEPER集群搭建及测试
- 【Python环境】Scikit-Learn:开源的机器学习Python模块
- 【Python环境】可爱的 Python: 自然语言工具包入门
- 电脑静音工作,又听不到12306的来票音乐,纠结啊 !但春节前工作多任务重,不能安心工作,就动手做个“无声购票弹窗”工具吧!
- .net访问PostgreSQL数据库发生“找不到函数名”的问题追踪
- “领域驱动开发”实例之旅(1)--不一样的开发模式 一、分析业务需求。 二、设计领域对象模型 三、测试领域对象模型 四、设计业务处理类 五、设计Entity和Vi
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 干货 | 性能提升400%,ClickHouse在携程酒店数仓的实践
- 干货 | 携程如何基于ARIMA时序分析做业务量的预测
- Python爬取王者荣耀全套皮肤
- 怎么搭建直播平台,合理使用验证码工具类
- 再见了SpringMVC,这个框架有点厉害,甚至干掉了Servlet!
- 可以旋转的3D韦恩图你见过吗?
- BFE.dev前端刷题 104. 按层遍历DOM树
- nodejs,mongodb不同时区问题
- AkShare-中国宏观-全社会客货运输量
- AkShare-中国宏观-邮电业务基本情况
- AkShare-中国宏观-国际旅游外汇收入构成
- AkShare-中国宏观-民航客座率及载运率
- AkShare-中国宏观-航贸运价指数
- 您应该知道的11个JavaScript和TypeScript速记
- AkShare-中国宏观-央行货币当局资产负债