23
2018
12

JAVA学习-Java高级-GUI之AWT事件的基本概念、事件处理

Java高级-GUI之AWT事件处理

AWT事件的处理过程中,主要涉及3类对象:

Event(事件):用户对组件的一个操作,称之为一个事件,以类的形式出现,例如键盘操作对应的事件类是KeyEvent。事件实例在该事件发生时由系统自动产生。每一种事件都对应专门的监听者。

Event Source(事件源):事件发生的场所,通常就是各个组件本身,例如按钮Button。

Event Monitor(事件监听器):接收事件对象并对其进行处理的类对象,通常其中某个成员方法对事件进行相应的处理。

事件:AWT的相关事件继承于java.awt.AWTEvent类,这些事件分为两大类:

低级事件:基于组件和容器的事件,当一个组件发生事件,如鼠标进入、点击、拖放或组件窗口开关时触发的组件事件。比如:

ComponentEvent(组件事件:组件尺寸变化、移动)

ContainerEvent(容器事件:组件增加、移动)

WindowEvent(窗口事件:关闭窗口、窗口闭合、图标化)

FocusEvent(焦点事件)

KeyEvent(键盘事件)

MouseEvent(鼠标事件:鼠标单击、移动)

高级事件:基于语义的事件,它可以不和特定的动作相关联,而依赖于触发此事件的类。比如,在TextField中按Enter键会触发ActionEvent事件,滑动滚动条会触发AdjustmentEvent事件,选中项目列表的某一条就会触发ItemEvent事件。高级事件如:

ActionEvent(动作事件:按钮按下)

AdjustmentEvent(调节事件)

ItemEvent(项目事件:选中、反选时发生)

TextEvent(文本事件:文本对象改变)

事件监听器

事件监听器通常是一个类,该类必须实现与该事件类型相对应的接口。对应的接口被称为事件监听器接口。事件监听器接口类的名称与事件类的名称相对应,例如,MouseEvent事件类对应的监听器接口名为MouseListener。监听器接口如:

ActionListener

ItemListener

MouseMotionListener

MouseListener

KeyListener

FocusListener

AdjustmentListener

ComponentListener

WindowListener

ContainerListener

TextListener

事件适配器类

Java语言为一些事件监听器接口提供了适配器类(Adapter)。我们可以通过继承事件所对应的Adapter类,重写所需要的方法,无关的方法则不用实现。事件适配器为我们提供了一种简单的实现监听的手段,可以缩短程序代码。

java.awt.event包中定义的事件适配器类包括以下7个:

MouseAdapter

MouseMotionAdapter

KeyAdapter

WindowAdapter

ComponentAdapter

ContainerAdapter

FocusAdapter

 

demo:

package pkg1.awt;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class ListenerDemo {
public static void main(String[] args) {
MyFrameLis frame = new MyFrameLis("事件监听器");
frame.init();
}
}
class MyFrameLis extends Frame {
private Panel card_panel = null;// 卡片面板(放卡片布局管理器)
private Panel ctl_panel = null;// 控件面板(放流式布局管理器)
private CardLayout cardLayout = null;// 卡片布局管理器
private FlowLayout flowLayout = null;// 流式布局管理器
private Label lb1, lb2, lb3, lb4;
private TextField txt = null;
private Button btn_first, btn_pre, btn_next, btn_last;
private boolean isRegisted = false;
public MyFrameLis(String title) {
super(title);
// 初始化
init();
// 按钮添加事件监听器
registerListener();
}
public void init() {
card_panel = new Panel();
ctl_panel = new Panel();
cardLayout = new CardLayout();
flowLayout = new FlowLayout();
card_panel.setLayout(cardLayout);
ctl_panel.setLayout(flowLayout);
// Frame默认为BorderLayout布局,把两个Panel放在Frame中,一个上一个下
this.add(card_panel, BorderLayout.CENTER);
this.add(ctl_panel, BorderLayout.SOUTH);
// 卡片布局管理器放组件
// Label、TextField 创建控件
lb1 = new Label("Content1", Label.CENTER);
lb2 = new Label("Content2", Label.CENTER);
txt = new TextField("Content3");// 文本框
lb3 = new Label("Content4", Label.CENTER);
lb4 = new Label("Content5", Label.CENTER);
// 控件添加到容器,默认显示其中第一个卡片
card_panel.add("l" + (card_panel.getComponentCount() + 1), lb1);
card_panel.add("l" + (card_panel.getComponentCount() + 1), lb2);
card_panel.add("l" + (card_panel.getComponentCount() + 1), txt);
card_panel.add("l" + (card_panel.getComponentCount() + 1), lb3);
card_panel.add("l" + (card_panel.getComponentCount() + 1), lb4);
// 创建按钮对象
btn_first = new Button("first");
btn_pre = new Button("pre");
btn_next = new Button("next");
btn_last = new Button("last");
ctl_panel.add(btn_first);
ctl_panel.add(btn_pre);
ctl_panel.add(btn_next);
ctl_panel.add(btn_last);
ctl_panel.setBackground(Color.GRAY);
this.setSize(400, 300);
this.setLocation(800, 500);
this.setVisible(true);
card_panel.setVisible(true);
ctl_panel.setVisible(true);
}
private void registerListener() {
if (!isRegisted) {
BtnListener btnListener = new BtnListener();
btn_first.addActionListener(btnListener);
btn_pre.addActionListener(btnListener);
btn_next.addActionListener(btnListener);
btn_last.addActionListener(btnListener);
/*
注册鼠标移动事件 
lb1.addMouseMotionListener(new MouseMotionAdapter(){
@Override
public void mouseMoved(MouseEvent e) {
String mytxt=e.getX()+":"+e.getY();
//lb1.setText(mytxt);
System.out.println(mytxt);
super.mouseMoved(e);
}
});*/
//注册鼠标点击事件
lb1.addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e) {
String mytxt="鼠标点击";
//lb1.setText(mytxt);
System.out.println(mytxt);
super.mouseClicked(e);
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println("鼠标移出");
super.mouseExited(e);
}
});
//关闭窗口事件,之前没写监听事件默认是关不了的。
this.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
System.out.println("窗口关闭");
System.exit(0);
//super.windowClosing(e);
}
});
isRegisted = true;
}
}
// 按钮事件类,可以作为成员内部类
class BtnListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// System.out.println(e.getActionCommand());
// System.out.println(e.getSource());
Button btn = (Button) e.getSource();
String btnText = btn.getLabel();
System.out.println(btnText);
switch (btnText) {
case "first":
cardLayout.first(card_panel);
break;
case "pre":
cardLayout.previous(card_panel);
break;
case "next":
cardLayout.next(card_panel);
break;
case "last":
// cardLayout.show(card_panel,"l5");
cardLayout.last(card_panel);
break;
}
}
}
}

效果:



版权声明:
作者:真爱无限 出处:http://www.pukuimin.top 本文为博主原创文章版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接.
« 上一篇下一篇 »

相关文章:

评论列表:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。