1.Swing自定义事件-将一个组件的事件传递给另一个组件.
使用EventListenerList来管理事件,当A组件触发事件的时候,调用方法fireActionPerformed()来触发事件,然后再B组件中 actionPerformed()方法来接收事件.
当在容器KeyTextComponent中按下鼠标,我们就可以在Jframe中捕获触发的事件.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.EventListener;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.event.EventListenerList;
class KeyTextComponent extends JComponent {
private EventListenerList actionListenerList = new EventListenerList();
public KeyTextComponent() {
KeyListener internalKeyListener = new KeyAdapter() {
public void keyPressed(KeyEvent keyEvent) {
System.out.println("keyPressed");
if (actionListenerList != null) {
int keyCode = keyEvent.getKeyCode();
String keyText = KeyEvent.getKeyText(keyCode);
ActionEvent actionEvent = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, keyText);
fireActionPerformed(actionEvent);//触发事件
}
}
};
MouseListener internalMouseListener = new MouseAdapter() {
public void mousePressed(MouseEvent mouseEvent) {
requestFocusInWindow();
}
};
addKeyListener(internalKeyListener);
addMouseListener(internalMouseListener);
}
public void addActionListener(ActionListener actionListener) {//事件管理
actionListenerList.add(ActionListener.class, actionListener);
}
public void removeActionListener(ActionListener actionListener) {
actionListenerList.remove(ActionListener.class, actionListener);
}
protected void fireActionPerformed(ActionEvent actionEvent) {//触发事件
EventListener listenerList[] = actionListenerList.getListeners(ActionListener.class);
for (int i = 0, n = listenerList.length; i < n; i++) {
((ActionListener) listenerList[i]).actionPerformed(actionEvent);
}
}
public boolean isFocusable() {
return true;
}
}
public class KeyTextComponentDemo {
public static void main(String[] args) {
JFrame aWindow = new JFrame();
aWindow.setBounds(30, 30, 300, 300); // Size
aWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
KeyTextComponent com = new KeyTextComponent();
aWindow.add(com, "Center");
com.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("action");//获取事件
}
});
aWindow.add(new JTextField(), "South");
aWindow.setVisible(true); // Display the window
}
}