测试跟踪多个事件
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);
}
}