我自年上大学开始学习Java由于JavaSE的GUI编程不是很占优势因而也没有重视过尤其是事件监听处理综合看过很多Java讲师的视频以及网上相关资料特综合一下望对大家有帮助尤其是Java事件编程初学者愿大家看后不再犹豫用哪种方法而发愁
大家先看看简单的应用程序截图考虑一下如何实现
截图如图一图二图三
图一 初始界面截图
图二 蓝色按钮事件处理
图三 弹窗按钮事件处理
在此列举四种方法
自身类实现ActionListener接口作为事件监听器
通过匿名类处理
通过内部类处理
通过外部类处理
下面依次介绍
第一种自身类实现ActionListener接口作为事件监听器
这种方法是最基本的也是初学者经常使用的我当初即是如此
import javaawtColor;
import javaawtContainer;
import javaawtFlowLayout;
import javaawteventActionEvent;
import javaawteventActionListener;
import javaxswingJButton;
import javaxswingJDialog;
import javaxswingJFrame;
public class EventListener extends JFrame implements ActionListener {
private JButton btBlue btDialog;
/**
* Java事件监听处理——自身类实现ActionListener接口作为事件监听器
*
* @author codebrother
*/
// 构造方法
public EventListener() {
// 设置标题栏内容
setTitle(Java GUI 事件监听处理);
// 设置初始化窗口位置
setBounds( );
// 设置窗口布局
setLayout(new FlowLayout());
// 创建按钮对象
btBlue = new JButton(蓝色);
// 将按钮添加事件监听器
btBlueaddActionListener(this);
// 创建按钮对象
btDialog = new JButton(弹窗);
// 将按钮添加事件监听器
btDialogaddActionListener(this);
// 把按钮容器添加到JFrame容器上
add(btBlue);
add(btDialog);
// 设置窗口可视化
setVisible(true);
// 设置窗口关闭
setDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
}
// ***************************事件处理***************************
@Override
public void actionPerformed(ActionEvent e) {
// 判断最初发生Event事件的对象
if (egetSource() == btBlue) {
// 获得容器
Container c = getContentPane();
// 设置容器背景颜色
csetColorBLUE);
}
else if (egetSource() == btDialog) {
// 创建JDialog窗口对象
JDialog dialog = new JDialog();
dialogsetBounds( );
dialogsetVisible(true);
}
}
// ***************************主方法***************************
public static void main(String[] args) {
new EventListener();
}
}
第二种通过匿名类处理
这是比较好的一种方法我是在年开始使用这种方法的
import javaawtColor;
import javaawtContainer;
import javaawtFlowLayout;
import javaawteventActionEvent;
import javaawteventActionListener;
import javaxswingJButton;
import javaxswingJDialog;
import javaxswingJFrame;
public class EventListener extends JFrame {
private JButton btBlue btDialog;
/**
* Java事件监听处理——匿名类处理
*
* @author codebrother
*/
// 构造方法
public EventListener() {
// 设置标题栏内容
setTitle(Java GUI 事件监听处理);
// 设置初始化窗口位置
setBounds( );
// 设置窗口布局
setLayout(new FlowLayout());
// 创建按钮对象
btBlue = new JButton(蓝色);
// 添加事件监听器(此处即为匿名类)
btBlueaddActionListener(new ActionListener() {
// 事件处理
@Override
public void actionPerformed(ActionEvent e) {
// 获得容器设置容器背景颜色
Container c = getContentPane();
csetColorBLUE);
}
});
// 创建按钮对象并添加事件监听器
btDialog = new JButton(弹窗);
btDialogaddActionListener(new ActionListener() {
// 事件处理
@Override
public void actionPerformed(ActionEvent e) {
// 创建JDialog窗口对象
JDialog dialog = new JDialog();
dialogsetBounds( );
dialogsetVisible(true);
}
});
// 把按钮容器添加到JFrame容器上
add(btBlue);
add(btDialog);
// 设置窗口可视化
setVisible(true);
// 设置窗口关闭
setDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
}
// ***************************主方法***************************
public static void main(String[] args) {
new EventListener();
}
}
第三种通过内部类处理
该种方法更符合面向对象编程的思想
import javaawtColor;
import javaawtContainer;
import javaawtFlowLayout;
import javaawteventActionEvent;
import javaawteventActionListener;
import javaxswingJButton;
import javaxswingJDialog;
import javaxswingJFrame;
public class EventListener extends JFrame {
private JButton btBlue btDialog;
/**
* Java事件监听处理——内部类处理
*
* @author codebrother
*/
// 构造方法
public EventListener() {
// 设置标题栏内容
setTitle(Java GUI 事件监听处理);
// 设置初始化窗口位置
setBounds( );
// 设置窗口布局
setLayout(new FlowLayout());
// 创建按钮对象
btBlue = new JButton(蓝色);
// 添加事件监听器对象(面向对象思想)
btBlueaddActionListener(new ColorEventListener());
btDialog = new JButton(弹窗);
btDialogaddActionListener(new DialogEventListener());
// 把按钮容器添加到JFrame容器上
add(btBlue);
add(btDialog);
// 设置窗口可视化
setVisible(true);
// 设置窗口关闭
setDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
}
// 内部类ColorEventListener实现ActionListener接口
class ColorEventListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
Container c = getContentPane();
csetColorBLUE);
}
}
// 内部类DialogEventListener实现ActionListener接口
class DialogEventListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// 创建JDialog窗口对象
JDialog dialog = new JDialog();
dialogsetBounds( );
dialogsetVisible(true);
}
}
// ***************************主方法***************************
public static void main(String[] args) {
new EventListener();
}
}
第四种通过外部类处理
这种我个人不常用
import javaawtColor;
import javaawtContainer;
import javaawtFlowLayout;
import javaawteventActionEvent;
import javaawteventActionListener;
import javaxswingJButton;
import javaxswingJDialog;
import javaxswingJFrame;
public class EventListener extends JFrame {
private JButton btBlue btDialog;
/**
* Java事件监听处理——外部类处理
*
* @author codebrother
*/
// 构造方法
public EventListener() {
// 设置标题栏内容
setTitle(Java GUI 事件监听处理);
// 设置初始化窗口位置
setBounds( );
// 设置窗口布局
setLayout(new FlowLayout());
// 创建按钮对象
btBlue = new JButton(蓝色);
// 将按钮添加事件监听器
btBlueaddActionListener(new ColorEventListener(this));
// 创建按钮对象
btDialog = new JButton(弹窗);
// 将按钮添加事件监听器
btDialogaddActionListener(new DialogEventListener());
// 把按钮容器添加到JFrame容器上
add(btBlue);
add(btDialog);
// 设置窗口可视化
setVisible(true);
// 设置窗口关闭
setDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
}
// ***************************主方法***************************
public static void main(String[] args) {
new EventListener();
}
}
// 外部类ColorEventListener实现ActionListener接口
class ColorEventListener implements ActionListener {
private EventListener el;
ColorEventListener(EventListener el) {
thisel = el;
}
@Override
public void actionPerformed(ActionEvent e) {
Container c = elgetContentPane();
csetColorBLUE);
}
}
// 外部类DialogEventListener实现ActionListener接口
class DialogEventListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// 创建JDialog窗口对象
JDialog dialog = new JDialog();
dialogsetBounds( );
dialogsetVisible(true);
}
}
你可能注意到为什么我写了两个监听事件就是加以区分这些方法的区别
第一种的监听处理部分如果有多个(我就写过三十多个的事件监听包含菜单栏按钮事件监听和工具栏按钮事件监听)那就需要一个个去判断从理论上说是影响程序速度的
第二种和第三种比较常用如果程序的监听事件比较少可以用第二种匿名类很合适
第三种符合面向对象编程(可以设置内部类只提供自身类使用而且方便使用自身类的资源)尤其是适合多个监听事件的处理当然也适合第二种方法情况
第四种是外部类如果多个监听事件相同就可以选用此种方法
个人愚见建议初学者掌握这四种方法侧重于第二三种怎么学不重要重要的是达到目的使自己的GUI编程运用自如多编程多思考提升编程思想多看别人的代码取其精华有很大帮助!