跟踪多个事件

测试跟踪多个事件

MyButton是TrackEvent的一个内部类,所以MyButton能访问父窗口,并操作其文本区域,这正是能够把状态信息写到父窗体的文本区域内所必需的。当然,这是一个受限的解决方案,因为MyButton被局限去只能与TrackEvent一起使用。这种情况有时称为“高耦合”代码。

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.HashMap;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;


public class TrackEvent extends JFrame
{

	private HashMap<String,JTextField> h=new HashMap<String,JTextField>();
	private String[] event={"focusGained","focusLost","keyPressed","keyReleased",
			"keyTyped","mouseClicked","mouseEntered","mouseExited","mousePressed",
			"mouseReleased","mouseDragged","mouseMoved"};
	private MyButton 
	b1=new MyButton(Color.BLUE,"test1"),
	b2=new MyButton(Color.RED,"test2");
	public class MyButton extends JButton {
		public MyButton(Color color, String label) {
			// TODO 自动生成的构造函数存根
			super(label);
			setBackground(color);
			addFocusListener(fl);
			addMouseListener(ml);
			addKeyListener(kl);
			this.addMouseMotionListener(mml);
		}
		///report函数
		void report(String field,String msg) {
			h.get(field).setText(msg);
		}
		FocusListener fl=new FocusListener() {
			public void focusGained(FocusEvent arg0) {
				// TODO 自动生成的方法存根
				report("focusGained", arg0.paramString());
			}

			public void focusLost(FocusEvent arg0) {
				// TODO 自动生成的方法存根
				report("focusLost",arg0.paramString());
			}
		};
		KeyListener kl=new KeyListener() {

			public void keyPressed(KeyEvent arg0) {
				// TODO 自动生成的方法存根
				report("keyPressed",arg0.paramString());
			}

			public void keyReleased(KeyEvent arg0) {
				// TODO 自动生成的方法存根
				report("keyReleased",arg0.paramString());
			}

			public void keyTyped(KeyEvent arg0) {
				// TODO 自动生成的方法存根
				report("keyTyped",arg0.paramString());
			}
			
		};
		MouseListener ml=new MouseListener(){

			public void mouseClicked(MouseEvent arg0) {
				// TODO 自动生成的方法存根
				report("mouseClicked",arg0.paramString());
			}

			public void mouseEntered(MouseEvent arg0) {
				// TODO 自动生成的方法存根
				report("mouseEntered",arg0.paramString());
			}

			public void mouseExited(MouseEvent arg0) {
				// TODO 自动生成的方法存根
				report("mouseExited",arg0.paramString());
			}

			public void mousePressed(MouseEvent arg0) {
				// TODO 自动生成的方法存根
				report("mousePressed",arg0.paramString());
			}

			public void mouseReleased(MouseEvent arg0) {
				// TODO 自动生成的方法存根
				report("mouseReleased",arg0.paramString());
			}
			
		};
		MouseMotionListener mml=new MouseMotionListener()
		{

			public void mouseDragged(MouseEvent arg0) {
				// TODO 自动生成的方法存根
				report("mouseDragged",arg0.paramString());
				//System.out.println("mouseDragged");
			}

			public void mouseMoved(MouseEvent arg0) {
				// TODO 自动生成的方法存根
				report("mouseMoved",arg0.paramString());
				//System.out.println("mouseMoved");
			}
			
		};
	}
	
	public TrackEvent(){
		this.setLayout(new GridLayout(event.length+1,2));
		for(String evt:event){
			JTextField t=new JTextField();
			t.setEditable(false);
			this.add(new JLabel(evt,JLabel.RIGHT));
			this.add(t);
			h.put(evt, t);
		}
		this.add(b1);
		this.add(b2);
	}
	
	public static void main(String[] args){
		GeneralCode.run(new TrackEvent(), 700, 500);
	}
}


 

将上面的代码分割成两个单独的类去调用。将HashMap和Event定义成静态,并且可以由主窗体调用。下面是Button的继承类。
import java.awt.*;
import java.awt.event.*;
import java.util.*;

import javax.swing.*;


public class ButtonEvent extends JButton
{
	public static HashMap<String,JTextField> h=new HashMap<String,JTextField>();
	public static String[] events={"focusGained","focusLost","keyPressed","keyReleased",
		"keyTyped","mouseClicked","mouseEntered","mouseExited","mousePressed",
		"mouseReleased","mouseDragged","mouseMoved"};
	public void report(String field,String msg)
	{
		h.get(field).setText(msg);
	}
	FocusListener fl=new FocusListener(){

		public void focusGained(FocusEvent arg0) {
			// TODO 自动生成的方法存根
			report("focusGained", arg0.paramString());
		}

		public void focusLost(FocusEvent arg0) {
			// TODO 自动生成的方法存根
			report("focusLost", arg0.paramString());
		}
	};
	KeyListener kl=new KeyListener()
	{

		public void keyPressed(KeyEvent e) {
			// TODO 自动生成的方法存根
			report("keyPressed", e.paramString());
		}

		public void keyReleased(KeyEvent e) {
			// TODO 自动生成的方法存根
			report("keyReleased", e.paramString());
		}

		public void keyTyped(KeyEvent e) {
			// TODO 自动生成的方法存根
			report("keyTyped", e.paramString());
		}
		
	};
	MouseListener ml=new MouseListener()
	{

		public void mouseClicked(MouseEvent arg0) {
			// TODO 自动生成的方法存根
			report("mouseClicked", arg0.paramString());
		}

		public void mouseEntered(MouseEvent arg0) {
			// TODO 自动生成的方法存根
			report("mouseEntered", arg0.paramString());
		}

		public void mouseExited(MouseEvent arg0) {
			// TODO 自动生成的方法存根
			report("mouseExited", arg0.paramString());
		}

		public void mousePressed(MouseEvent arg0) {
			// TODO 自动生成的方法存根
			report("mousePressed", arg0.paramString());
		}

		public void mouseReleased(MouseEvent arg0) {
			// TODO 自动生成的方法存根
			report("mouseReleased", arg0.paramString());
		}
		
	};
	MouseMotionListener mml=new MouseMotionListener()
	{

		public void mouseDragged(MouseEvent e) {
			// TODO 自动生成的方法存根
			report("mouseDragged", e.paramString());
		}

		public void mouseMoved(MouseEvent e) {
			// TODO 自动生成的方法存根
			report("mouseMoved", e.paramString());
		}
		
	};
	public ButtonEvent(Color color,String label)
	{
		super(label);
		this.addKeyListener(kl);
		this.addMouseListener(ml);
		this.addFocusListener(fl);
		this.addMouseMotionListener(mml);
		this.setBackground(color);
	}
}

下面是主函数

import java.awt.*;
import javax.swing.*;

public class TrackEvent2 extends JFrame{
	private ButtonEvent
		b1=new ButtonEvent(Color.BLUE,"ButtonEvent1"),
		b2=new ButtonEvent(Color.RED,"ButtonEvent2");
	public TrackEvent2()
	{
		this.setLayout(new GridLayout(ButtonEvent.events.length+1,2));
		for(String evt:ButtonEvent.events)
		{
			JTextField t=new JTextField();
			t.setEditable(false);
			this.add(new JLabel(evt,JLabel.RIGHT));
			this.add(t);
			ButtonEvent.h.put(evt,t);
		}
		this.add(b1);
		this.add(b2);
		
	}
	public static void main(String[] args){
		GeneralCode.run(new TrackEvent2(), 700, 500);
	}
}


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值