常见事件及相应事件源类型
事件源 | 用户操作 | 事件 |
JButton | 点击按钮 | ActionEvent |
JTextField | 在文本域按回车键 | ActionEvent |
JCheckBox | 点击复选框 | ActionEvent, ItemEvent |
JRadioButton | 点击单选按钮 | ActionEvent, ItemEvent |
JComBox | 选定选项 | ActionEvent, ItemEvent |
JList | 选定选项 | ListSelectionEvent |
JMenuItem | 选定菜单项 | ActionEvent, ItemEvent |
JSlider | 滑动滑块 | ChangeEvent |
Window | 窗口打开,关闭等 | WindowEvent |
Component | 点击或移动鼠标 | MouseEvent |
Component | 按下或释放键盘上的键 | KeyEvent |
Container | 在容器中添加或删除组件 | ContainerEvent |
Component | 组件获得或失去焦点 | FocusEvent |
Component | 组件移动,改变大小 | ComponentEvent |
JScrollBar |
移动滚动条 |
AdjustmentEvent |
java事件处理机制使用的是事件委托处理模型.事件监听器并不会自动接收某个组件触发的事件,要想监听器接收某个组件触发的某种事件,
就必须在该事件源中注册它(因此,程序可以有选择的忽略事件).所谓注册就是调用事件源提供的注册方法来声明某个对象是该事件源的监听器.
java语言中每种类型的事件定义了相应的监听器接口和注册方法.
一般来说,XXX事件的监听器接口是XXXListener,注册方法是addXXXListener.
部分常见的监听器接口
事件 | 监听器接口及注册方法 | 监听器方法 |
ActionEvent |
ActionListener addActionListener |
actionPerformed(ActionEvent e) |
AdjustmentEvent |
AdjustmentListener addAdjustmentListener() |
adjustValueChanged(AdjustmentEvent e) |
ComponentEvent |
ComponentListener addComponentListener() |
componentResized(ComponentEvent e) componentMoved(ComponentEvent e) componentShown(ComponentEvent e) componentHidden(ComponentEvent e) |
ContainerEvent |
ContainerEventListener addContainerEventListener() |
componentAdded(ContainerEvent e) componentRemoved(ContainerEvent e) |
FocusEvent |
FocusListener addFocusListener() |
focusGained(FocusEvent e) focusLost(FocusEvent e) |
ItemEvent |
ItemListener addItemListener() |
itemStateChanged(ItemEvent e) |
KeyEvent |
KeyListener addKeyListener() |
keyTyped(KeyEvent e) keyPressed(KeyEvent e) keyReleased(KeyEvent e) |
MouseEvent |
MouseListener addMouseListener() |
mouseClicked(MouseEvent e) mousePressed(MouseEvent e) mouseReleased(MouseEvent e) mouseEntered(MouseEvent e) mouseExited(MouseEvent e) |
MouseEvent |
MouseMotionListener MouseMotionListener() |
mouseDragged(MouseEvent e) mouseMoved(MouseEvent e) |
TextEvent |
TextListener addTextListener() |
textValueChanged(TextEvent e) |
WindowEvent |
WindowListener addWindowListener() |
stateChanged(ChangeEvent e) |
ListSelectionEvent |
ListSelectionListener addListSelectionListener() |
valueChanged(ListSelectionEvent e) |
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import javax.swing.JButton;
import javax.swing.JFrame; public class JButtonEvent extends JFrame implements ActionListener{
public JButtonEvent(){
JButton button=new JButton("按钮");
button.addActionListener(this); //注册
add(button);
}
public static void main(String[] args) {
JButtonEvent frame=new JButtonEvent();
frame.setTitle("演示动作事件处理");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500,300);
frame.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) { //实现监听器接口中的方法
System.out.println(((JButton)e.getSource()).getText());
}
}
运行结果
这种编程方式有许多不足,如可读性,重用性不佳等.现在比较流行使用内部类,特别是匿名内部类来实现监听类接口.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import javax.swing.JButton;
import javax.swing.JFrame; public class JButtonEvent1 extends JFrame {
public JButtonEvent1(){
JButton button=new JButton("测试按钮");
button.addActionListener(new ActionListener() {//匿名内部类 @Override
public void actionPerformed(ActionEvent e) {
System.out.println(((JButton)e.getSource()).getText());
}
});
add(button);
}
public static void main(String[] args) {
JButtonEvent1 frame=new JButtonEvent1();
frame.setTitle("演示动作事件处理");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500,300);
frame.setVisible(true);
}
}