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 }}