1. 事件类之间的继承关系?
答:
2. 各个事件及其相关方法?
答:
3. 事件监听器的注册?
答:
1)注册事件监听器
处理事件的基本方法,是事件监听器的注册,即将组建对象和监听器对象相联系。只需要使用对象的addXXXListener方法,当事件源发生某种类型的事件时,则触发事先已注册过的监听器中相应的处理程序。
2)一个对象注册对个监听器
事件源可以产生多种不同类型的事件,因而可以注册(触发)多种不同类型的监听器。例如,程序中frame对象注册m1和m2两个监听器,即在一个框架中移动鼠标,或者拖动鼠标并画出痕迹,而且框架下方都显示鼠标的位置:
import java.awt.*;import java.awt.event.*;
public class TestMultiListener {
public static void main(String[] args) {
Frame frame=new Frame("Test");
TextField msg=new TextField(50);
Monitor1 m1=new Monitor1(frame);
Monitor2 m2=new Monitor2(frame, msg);
frame.addWindowListener(m1);
frame.addMouseMotionListener(m2);
frame.add(msg, BorderLayout.SOUTH);
frame.setSize(200,160);
frame.setVisible(true);
}
}
class Monitor1 implements WindowListener{
private Frame frame;
public Monitor1(Frame frame) {
this.frame=frame;
}
public void windowClosing(WindowEvent e) {System.exit(0);}
public void windowOpened(WindowEvent e) {}//windowListener有7个方法,即使不做任何事,也要书写
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
}
class Monitor2 implements MouseMotionListener{
private Frame frame;
private TextField msg;
private boolean bDragged=false;
public Monitor2(Frame frame,TextField msg) {
this.frame=frame;
this.msg=msg;
}
public void mouseMoved(MouseEvent e) {
msg.setText("MouseMoved:"+e.getX()+","+e.getY());
if(bDragged) {
msg.setText("MouseMoved:"+e.getX()+","+e.getY());
bDragged=false;
}
}
public void mouseDragged(MouseEvent e){
msg.setText("MouseDragged:"+e.getX()+","+e.getY());
if(!bDragged) {
frame.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));//设置鼠标形态为十字星
bDragged=true;
}
frame.getGraphics().drawLine(e.getX(), e.getY(), e.getX(), e.getY());
}
}
3)多个对象注册到一个监听器
import java.awt.*;import java.awt.event.*;public class TestMultiObjectOneListener { public static void main(String[] args) { Frame frame=new Frame("Test"); Button b1=new Button("start"); TextField b2=new TextField("input text:"); Monitor3 m=new Monitor3(); b1.addActionListener(m); b2.addActionListener(m); frame.add(b1, "North"); frame.add(b2,"Center"); frame.pack(); frame.setVisible(true); }}class Monitor3 implements ActionListener{ public void actionPerformed(ActionEvent e) { System.out.println("a button\n"+e.getSource() +"\nhas been pressed.\n"+ "command is: "+e.getActionCommand() ); }}
4. 事件适配器(Adapter)?
答:用实现接口的方法,必须实现接口所规定的的方法,如上面说的windowListener,为简化编程,为一些事件监听器接口定义了相应的实现类——事件适配器类,有七种:
ComponentAdapter,ContainerAdapter,FocusAdapter,KeyAdapter,MouseAdapter,MouseMotionAdapter 和 WindowAdapter。
在定义监听器时就可以继承Adapter类,并只重写所需要的方法。例如,将3.2例中Monitor1改为
class Monitor1 extends WindowAdapter{ private Frame frame; public Monitor1(Frame frame) { this.frame=frame; } public void windowClosing(WindowEvent e) { System.exit(0); }}
5. 内部类作为事件监听器?
答:例如,
import java.awt.*;import java.awt.event.*;public class TestInnerListener { Frame frame=new Frame("内部类测试"); TextField textField=new TextField(30); public TestInnerListener() { frame.add(new Label("请按下鼠标左键并拖动"),"North"); frame.add(textField,"South"); frame.setBackground(new Color(200, 0, 0));//red,green,blue component frame.addMouseMotionListener(new InnerMonitor()); frame.addMouseListener(new InnerMonitor()); frame.setSize(300, 200); frame.setVisible(true); } public static void main(String[] args) { Object t=new TestInnerListener(); } private class InnerMonitor implements MouseMotionListener, MouseListener{ public void mouseDragged(MouseEvent e) { String string="鼠标拖动到位置("+e.getX()+","+e.getY()+")"; textField.setText(string); } public void mouseEntered(MouseEvent e) { String string="鼠标已进入窗体"; textField.setText(string); } public void mouseExited(MouseEvent e) { String string="鼠标已移出窗体"; textField.setText(string); } public void mouseMoved(MouseEvent e) {};//java中一个类只能单继承,所以这里要用实现接口的方法 public void mousePressed(MouseEvent e) {}; public void mouseClicked(MouseEvent e) {}; public void mouseReleased(MouseEvent e) {}; }}
结果:
6. 匿名类作为事件监听器?
答:例如,
import java.awt.*;import java.awt.event.*;public class TestAnonymous { Frame frame = new Frame("匿名内部类测试"); TextField textField = new TextField(30); public TestAnonymous() { frame.add(new Label("请按下鼠标左键并拖动"),"North"); frame.add(textField, "South"); frame.addMouseMotionListener(new MouseMotionListener() { public void mouseMoved(MouseEvent e) { String string="鼠标拖动到位置("+e.getX()+","+e.getY()+")"; textField.setText(string); } public void mouseDragged(MouseEvent e) {} }); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.setSize(300, 200); frame.setVisible(true); } public static void main(String[] args) { TestAnonymous t = new TestAnonymous(); }}