注册事件监听器和处理事件

来自CloudWiki
跳转至: 导航搜索

事件处理

java采用一个基于委派的模型来进行事件处理:一个源对象触发一个事件,然后一个对该事件感兴趣的对象处理它。后者称为事件处理器或事件监听器。

一个对象如果要成为一个源对象的事件处理器,需要满足两个条件:

  1. 监听器对象必须是一个对应的事件处理接口的实例,
  2. 监听器对象必须通过源对象注册。

例如:实现如图所示程序,设置窗口的背景色为按钮对应颜色。

Java8-9.png

具体实现如下:

实现窗体布局

package task10;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class BackGroundColor extends JFrame{
	private JButton btRed;
	private JButton btGreen;
	private JButton btBlue;
	private JPanel buttonPanel;
	public BackGroundColor(){
		super("改变颜色");
		
		btRed = new JButton("红色");
		btGreen = new JButton("绿色");
		btBlue = new JButton("蓝色");
			
		buttonPanel= new JPanel();
		buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
		buttonPanel.add(btRed);
		buttonPanel.add(btGreen);
		buttonPanel.add(btBlue);
		
		this.add(buttonPanel);
		
		setSize(300,200);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		BackGroundColor bg = new BackGroundColor();
	}
	
	
}


观察有什么事件需要处理

由前面的知识知道,点击按钮所触发的事件是ActionEvent

我们需要处理ActionEvent事件。

创建内部类监听器类

处理相关事件的方法就是创建一个监听器(类)。

因此,我们:

  • 创建内部类监听器类ComputeAction,
  • 实现接口ActionListener
  • 并实现接口中的方法actionPerformed(ActionEvent e),在方法中添加事件处理内容。
private class ColorAction implements ActionListener{
	    private Color bgColor;
		public ColorAction( ){
			
		}
           public ColorAction(Color bgColor){
			this.bgColor = bgColor;
		}
	   @Override
	   public void actionPerformed(ActionEvent e) {
			buttonPanel.setBackground(bgColor);
	   }		
}

生成事件监听器对象,并为按钮注册监听器对象

btRed.addActionListener(new ColorAction(Color.RED));
	btGreen.addActionListener(new ColorAction(Color.GREEN));
	btBlue.addActionListener(new ColorAction(Color.BLUE));

完整代码

public class BackGroundColor extends JFrame {
	private JButton btRed;
	private JButton btGreen;
	private JButton btBlue;
	final JPanel buttonPanel;
	
	public BackGroundColor(){
		super("改变颜色");
		btRed = new JButton("红色");
		btGreen = new JButton("绿色");
		btBlue = new JButton("蓝色");
		
		btRed.addActionListener(new ColorAction(Color.RED));
		btGreen.addActionListener(new ColorAction(Color.GREEN));
		btBlue.addActionListener(new ColorAction(Color.BLUE));
		
		buttonPanel = new JPanel();
		buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
		buttonPanel.add(btRed);
		buttonPanel.add(btGreen);
		buttonPanel.add(btBlue);
		add(buttonPanel);
		
		setSize(300,200);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}
	public static void main(String[] args) {
		 BackGroundColor bg = new BackGroundColor();
	}
	private class ColorAction implements ActionListener{
		private Color bgColor;
		public ColorAction(Color bgColor){
			this.bgColor = bgColor;
		}
		@Override
		public void actionPerformed(ActionEvent e) {
			buttonPanel.setBackground(bgColor);
		}		
	}
}

返回 Java程序设计