GUI图形界面编程之事件处理机制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
GUI图形界⾯编程之事件处理机制
事件处理机制三要素:
事件源:能够产⽣事件的组件
事件:⽤户对组件的⼀个操作
事件监听器:接收事件、解释事件并处理⽤户交互的⽅法处理事件源发⽣的事件
事件处理机制:当组件(⽐如 Button)被点击时就会产⽣ActionEvent事件,事件被传递给⼀个 ActionListener 对象,再由ActionListener 定义的⽅法来响应处理事件(⾃动调⽤ActionEvent)
当事件发⽣后,将某事件的对象传递给事件监听器(事件监听器实现了发⽣此事件所对应的接⼝),事件监听器会处理此事件,为了监视此事件,事件的处理⽅要先向发⽣⽅注册
事件有很多种,监听事件所实现的接⼝也有很多种。
监听哪件事,就必须实现此事件的接⼝。
事件与监听事件的接⼝⼀⼀对应
按钮事件处理机制:
按钮事件(ActionEvent):组件的特定动作(⽐如被按下)发⽣时,由组件(⽐如Button)⽣成此⾼级别事件
要使⽤键盘在Button上触发ActionEvent,请使⽤空格键
监听器接⼝:ActionListener
⼀个监听器监听⼀个事件源对象
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
*
*程序功能:
*时间:
* @author Administrator
*/
public class Test1 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建⾯板及按钮
Frame f=new Frame();
Button b=new Button();
f.add(b,BorderLayout.NORTH);
f.setVisible(true);
f.setResizable(true);
f.pack();
//创建监听器
Monitor bh=new Monitor();
//事件注册:表⽰监听器bh监听对象b,当事件发⽣后,调⽤接⼝中的⽅法
b.addActionListener(bh);
}
}
class Monitor implements ActionListener{
//当事件触发时执⾏此⽅法
//当事件发⽣后,把此事件具体信息封装成对象传递给此函数的参数e
public void actionPerformed(ActionEvent e){
System.out.println("Press\n");
}
1个监听器监听多个事件源对象
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
*
*程序功能:
*时间:
* @author Administrator
*/
public class Test1 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建⾯板及按钮
Frame f=new Frame();
Button b1=new Button();
Button b2=new Button();
f.add(b1,BorderLayout.NORTH);
f.add(b2,BorderLayout.CENTER);
f.setVisible(true);
f.setResizable(true);
f.pack();
//创建监听器
Monitor bh=new Monitor();
//事件注册:表⽰监听器bh监听对象b,当事件发⽣后,调⽤接⼝中的⽅法
b1.addActionListener(bh);
b2.addActionListener(bh);
//重设提⽰
b2.setActionCommand("Stop");
}
}
class Monitor implements ActionListener{
//当事件触发时执⾏此⽅法
//当事件发⽣后,把此事件具体信息封装成对象传递给此函数的参数e
public void actionPerformed(ActionEvent e){
System.out.println("Press\n"+e.getActionCommand());
}
}
TextField 对象可能发⽣Action(光标在⽂本框中敲回车)事件,与该事件对应的事件类是java.awt.event.ActionEvent. java.awt.event.ActionListener接⼝处理ActionEvent事件
创建⽂本框并实现⽂本框输⼊显⽰到命令⾏中
⽂本框输⼊内容不可见
import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
new TextFieldDemo();
}
class TestFieldDemo extends Frame {
TestField tf=null;
Monitor2 m=null;
TestFieldDemo(){
//创建⾯板
tf=new TestField();
this.add(tf);
this.setVisible(true);
this.pack();
//设置此⽂本字段的回显字符(⽤于输⼊密码)
tf.setEchoChar('*');
//创建监听器
m=new Monitor2();
//注册
tf.addActionListener(m);
}
}
class Monitor2 implements ActionListener{
public void actionPerformed(ActionEvent e){
TextField tf=(TextField)e.getSource();
System.out.println(tf.getText());
tf.setText("");
}
}
内部类:可以⽅便的访问包装类的成员变量或成员⽅法。
不允许或不需要被其他类访问
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import bel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
*
*程序功能:实现⼀个加法运算。
两个加数及结果数放在⽂本框中,通过按钮事件处理机制实现。
*时间:2014-5-11
*
* @author Administrator
*/
public class Test4 {
public static void main(String[] args){
new FrameDemo().LaunchFrame();
}
}
class FrameDemo extends Frame{
TextField t1=null;
TextField t2=null;
TextField t3=null;
public void LaunchFrame(){
//创建⾯板
t1=new TextField(10);
t2=new TextField(10);
t3=new TextField(15);
Label l=new Label("+");
Button b=new Button("=");
this.setLayout(new FlowLayout());
this.add(t1);
this.add(l);
this.add(t2);
this.add(b);
this.add(t3);
this.setResizable(true);
this.pack();
this.setVisible(true);
//创建监控器及监控按钮事件
b.addActionListener(new Monitor3());
}
//内部类访问包装类的成员
class Monitor3 implements ActionListener{
int t11=0;
int t22=0;
public void actionPerformed(ActionEvent e){
//取出t1,t2⽂本框中的内容
try{
t11=Integer.parseInt(t1.getText());
t22=Integer.parseInt(t2.getText());
}catch(NumberFormatException e2){
e2.printStackTrace();
}
//将t11与t22的和显⽰在t3⽂本框中
t3.setText("" + (t11+t22));
}
}
}
Graphic类:⽤于窗⼝画图,相当于画笔。
要想在哪个组件中画图,就在哪个组件中重写paint(Graphic g)⽅法。
paint⽅法在需要重画的时候⾃动调⽤。
⽐如显⽰窗⼝,窗⼝最⼤化,最⼩化等import java.awt.*;
/**
*
*
*程序功能:在⾯板上显⽰图案
*
* @author Administrator
*/
public class PaintDemo {
public static void main(String[] args) {
new PaintFrame().launchFrame();
}
}
class PaintFrame extends Frame {
public void launchFrame() {
//创建⾯板
setBounds(200,200,640,480);
setVisible(true);
}
//使⽤paint⽅法画图
public void paint(Graphics g) {
//保存默认颜⾊
Color c = g.getColor();
g.setColor(Color.red);
g.fillOval(50, 50, 30, 30);
g.setColor(Color.green);
g.fillRect(80,80,40,40);
//恢复默认颜⾊
g.setColor(c);
}
}
⿏标事件处理机制:
⿏标事件(MouseEvent):当且仅当动作发⽣时⿏标光标处于特定组件边界未被遮掩的部分上,才认为在该组件上发⽣了⿏标动作,⽣成此低级别事件
监听器接⼝:MouseListener:⿏标事件
MouseMotionListener:⿏标移动事件
对于以下动作,组件对象将⽣成此低级别事件:
⿏标事件
按下⿏标按键
释放⿏标按键
单击⿏标按键(按下并释放)
⿏标光标进⼊组件⼏何形状的未遮掩部分
⿏标光标离开组件⼏何形状的未遮掩部分
⿏标移动事件
移动⿏标
拖动⿏标
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class Test{
public static void main(String args[]) {
new MyFrame("drawing...");
}
}
class MyFrame extends Frame {
ArrayList points = null;
MyFrame(String s) {
super(s);
points = new ArrayList();
setLayout(null);
setBounds(300,300,400,300);
this.setBackground(new Color(204,204,255));
setVisible(true);
this.addMouseListener(new Monitor());
}
public void paint(Graphics g) {
Iterator i = points.iterator();
while(i.hasNext()){
Point p = (Point)i.next();
g.setColor(Color.BLUE);
g.fillOval(p.x,p.y,10,10);
}
}
public void addPoint(Point p){
points.add(p);
}
}
class Monitor extends MouseAdapter {
public void mousePressed(MouseEvent e) {
MyFrame f = (MyFrame)e.getSource();
f.addPoint(new Point(e.getX(),e.getY()));
f.repaint();
}
}
实现了监听器接⼝的类:MouseAdapter,MouseMotionAdapter
创建的监听器⼀般不继承MouseListener,⽽是继承MouseAdapter。
因为MouseListener接⼝有多于⼀个⽅法。
但是实现后⼀般只使⽤⼀个⽅法。
如果要实现接⼝,除了要使⽤的⽅法要重写外,其他不需要使⽤的⽅法也要重写成空⽅法,⽐较⿇烦。
⽽MouseAdapter已经把接⼝中的所有⽅法重写成空⽅法。
如果继承MouseAdapter,只需要重写你需要的⽅法即可。
window事件处理:
window事件(WindowEvent):
监听器接⼝:WindowListener
实现了监听器接⼝的类:WindowAdapter
实现关闭窗⼝
import java.awt.*;
import java.awt.event.*;
public class Test2 {
public static void main(String args[]) {
new MyFrame55();
}
}
class MyFrame55 extends Frame {
MyFrame55() {
setLayout(null);
setBounds(300, 300, 400, 300);
this.setBackground(Color.black);
setVisible(true);
this.addWindowListener(new MyWindowMonitor());
}
class MyWindowMonitor extends WindowAdapter {
public void windowClosing(WindowEvent e) {
setVisible(false);
System.exit(0);
}
}
}
匿名类:
⽅法⾥的逻辑简单、语句⽐较少、不经常变动时使⽤
import java.awt.*;
import java.awt.event.*;
public class Test2 {
public static void main(String args[]) {
new MyFrame55();
}
}
class MyFrame55 extends Frame {
MyFrame55() {
setLayout(null);
setBounds(300, 300, 400, 300);
this.setBackground(Color.black);
setVisible(true);
this.addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
setVisible(false);
System.exit(-1);
}
});
}
}
键盘事件处理机制:
键盘事件(KeyEvent):表⽰组件中发⽣键击的事件。
当按下、释放或键⼊某个键时,组件对象(如⽂本字段)将⽣成此低级别事件。
监听器接⼝:KeyListener
实现了监听器接⼝的类:KeyAdapter
当使⽤键盘上”向上箭头“键时,做出反应import java.awt.*;
import java.awt.event.*;
public class Test {
public static void main(String[] args) {
new KeyFrame().launchFrame();
}
}
class KeyFrame extends Frame {
public void launchFrame() {
setSize(200, 200);
setLocation(300,300);
addKeyListener(new MyKeyMonitor());
setVisible(true);
}
class MyKeyMonitor extends KeyAdapter {
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if(keyCode == KeyEvent.VK_UP) {
System.out.println("UP");
}
}
}
class Monitor2 extends WindowAdapter{
public void windowClosing(WindowEvent e){ setVisible(true);
System.exit(0);
}
}
}。