首页 > 代码库 > GUI图形界面编程之事件处理机制
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 java.awt.Label; 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); } } }