外观
事件监听
上文中涉及到的组件在点击时是没有任何效果的,需要给组件增加事件监听才可以触发事件。
事件——ActionEvent
ActionEvent是Swing中比较常用的事件监听器,很多组件的动作都可以使用它监听,如按钮被单击。下表描述了动作事件监听器的接口和事件源等。
| 定义 | 实现方式 |
|---|---|
| 事件名 | ActionEvent |
| 事件源 | JButton、JList等组件 |
| 监听接口 | ActionListener |
| 添加监听方法 | addActionLister() |
| 删除监听方法 | removeActionListener() |
示例代码:
package swing.ActionListeners;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class DemoEventListener extends JFrame {
//本文件演示如何使用事件监听
//本文件做一个带有多种组件的面板 为每个组件都加上事件监听 注意看代码
private DemoEventListener() {
super("事件监听程序");
setBounds(400, 300, 400, 200); //设置容器大小位置
setMaximumSize(new Dimension(400, 200)); //设置最小大小
//添加一个标签 用于提示事件发生的类型
JPanel jPanel = new JPanel();
jPanel.setLayout(new FlowLayout());
getContentPane().add(jPanel);
JLabel jLabel = new JLabel("无事件发生");
jLabel.setHorizontalAlignment(SwingConstants.CENTER);
getContentPane().add(jLabel, BorderLayout.SOUTH);
//下面添加组件 但不是重点 重点是事件监听
JButton jButton = new JButton("按钮");
jButton.setSize(50, 25);
//为按钮添加事件监听 按钮的事件监听是点击 以下不使用lambda表达式了
jButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { //事件监听类的唯一抽象方法 实现该方法即可完成事件监听 参数ActionEvent就是事件监听类
jLabel.setText("按钮被点击"); //更改标签 提示信息
}
});
jPanel.add(jButton);
JTextField jTextField = new JTextField(10);
jTextField.addActionListener(new ActionListener() { //文本框的事件监听是是否输入回车
public void actionPerformed(ActionEvent e) {
jLabel.setText("文本框输入了回车 此时文本框的内容是:" + jTextField.getText());
}
});
jPanel.add(jTextField);
JCheckBox jCheckBox = new JCheckBox("复选框");
jCheckBox.addActionListener(new ActionListener() { //复选框的事件监听是点击(因为复选框是复选按钮 也是按钮的一种)
public void actionPerformed(ActionEvent e) {
jLabel.setText("复选框改变了选中状态 是否被选中:" + jCheckBox.isSelected());
}
});
jPanel.add(jCheckBox);
JRadioButton jRadioButton = new JRadioButton("单选框"); //单选框的事件监听是点击
jRadioButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jLabel.setText("单选框改变了选中状态 是否被选中:" + jRadioButton.isSelected());
}
});
jPanel.add(jRadioButton);
JComboBox<String> jComboBox = new JComboBox<>(new String[]{"选项1", "选项2", "选项3"}); //下拉列表的事件监听是改变了选项
jComboBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jLabel.setText("下拉列表改变了选中项:" + jComboBox.getSelectedItem());
}
});
jPanel.add(jComboBox);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new DemoEventListener();
}
}运行结果:

当触发了对应组件的事件后下方会输出相关信息。
键盘事件——KeyEvent
当在文本框内输入内容时,键盘事件就会发生。KeyEvent负责捕获键盘事件,使用addKeyListener()方法就可以添加键盘监听事件。
KeyEventListener接口有三个抽象方法,分别是keyTyped(KeyEvent e)、keyPressed(KeyEvent e)、keyReleased(KeyEvent e),分别代表键盘被敲击、键盘被按下和键盘被松开。
KeyEvent类的常用方法如下:
getSource():返回触发事件的组件对象,为Object对象。getKeyChar():获取与此次事件有关的键盘按键字符。getKeyCode():获取与此次事件有关的键盘按键代码。getKeyText(int keyCode):获取与keyCode相对应的键盘按键字面值。isActionKey():用于查看触发此事件的按键是否为动作按键。isControlDown():用于查看ctrl键是否被按下。isAltDown():用于查看Alt键是否被按下。isShiftDown():用于查看Shift键是否被按下。
示例代码:
package swing.ActionListeners;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class DemoKeyboardListener extends JFrame {
//本文件演示如何使用键盘监听
//键盘监听常用如下两个方法: getKeyCode()获得键盘释放或按下时的键盘代码 对键盘击键无效 返回一个int值 其实是KeyEvent里的常量 可使用getKeyText()方法转换成字符串
//还有getKeyChar() 获得键盘击键时的字符 注意看下面的代码 这里只演示这两个方法 其他方法仅列出
//getSource()返回触发此次事件的组件对象 为Object类型 需要将其强制转换成正确的组件类型
private DemoKeyboardListener() {
super("键盘监听程序");
setBounds(400, 300, 400, 300);
setResizable(false);
setLayout(null);
JLabel jLabel1 = new JLabel("击键");
jLabel1.setBounds(10, 40, 30, 21);
getContentPane().add(jLabel1);
JLabel jLabel2 = new JLabel("按下");
jLabel2.setBounds(10, 120, 30, 21);
getContentPane().add(jLabel2);
JLabel jLabel3 = new JLabel("释放");
jLabel3.setBounds(10, 200, 30, 21);
getContentPane().add(jLabel3);
JLabel jLabel4 = new JLabel("结果:");
jLabel4.setBounds(160, 10, 30, 21);
getContentPane().add(jLabel4);
JTextArea jTextArea = new JTextArea();
JScrollPane jScrollPane = new JScrollPane(jTextArea);
jScrollPane.setBounds(160, 40, 200, 200);
jTextArea.setEditable(false);
jTextArea.setFont(new Font("微软雅黑", Font.BOLD, 15));
jScrollPane.setBorder(BorderFactory.createLineBorder(Color.GRAY));
getContentPane().add(jScrollPane);
JTextField jTextField1 = new JTextField();
jTextField1.addKeyListener(new KeyListener() { //文本框监听可使用KeyListener类 若是面板则需用KeyAdapter类
public void keyTyped(KeyEvent e) {
jTextArea.append("键盘被击键:" + e.getKeyChar() + "\n");
}
//键盘监听易错易忘点:
//getKeyCode()返回触发事件的关联的整数 这个数是KeyEvent里的VK_常量 它们也是整数值 若想通过此整数获取键盘相关的字符
//需配合getKeyText()方法使用 参数就是这个Code值 且此方法只能在键被释放和键被按下的方法里应用 由于击键的判断逻辑
//getKeyCode()方法在击键的方法里得不到与此事件相关联的值(总是0)
public void keyPressed(KeyEvent e) {}
public void keyReleased(KeyEvent e) {}
});
jTextField1.setBounds(50, 40, 100, 21);
getContentPane().add(jTextField1);
JTextField jTextField2 = new JTextField();
jTextField2.addKeyListener(new KeyListener() {
public void keyTyped(KeyEvent e) {}
public void keyPressed(KeyEvent e) {
jTextArea.append("键盘被按下:" + KeyEvent.getKeyText(e.getKeyCode()) + "\n");
}
public void keyReleased(KeyEvent e) {}
});
jTextField2.setBounds(50, 120, 100, 21);
getContentPane().add(jTextField2);
JTextField jTextField3 = new JTextField();
jTextField3.setBounds(50, 200, 100, 21);
jTextField3.addKeyListener(new KeyListener() {
public void keyTyped(KeyEvent e) {}
public void keyPressed(KeyEvent e) {}
public void keyReleased(KeyEvent e) {
jTextArea.append("键盘被释放:" + KeyEvent.getKeyText(e.getKeyCode()) + "\n");
}
});
new Thread(() -> {
while (true) {
try {
Thread.sleep(100);
if (jTextField1.getText().length() > 10) jTextField1.setText("");
if (jTextField2.getText().length() > 10) jTextField2.setText("");
if (jTextField3.getText().length() > 10) jTextField3.setText("");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
getContentPane().add(jTextField3);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new DemoKeyboardListener();
}
}运行结果:

当在对应的文本框内输入时,右边会显示触发的事件信息。
鼠标事件——MouseEvent
鼠标被单击、移入、移出等事件由MouseEvent表示,由MouseListener捕捉。MouseListener有五个抽象方法:mouseClicked(MouseEvent e),在鼠标被单击时触发、mousePressed(MouseEvent e),在鼠标按键被按下时触发、mouseReleased(MouseEvent e),在鼠标按键被松开时触发、mouseEntered(MouseEvent e),在鼠标指针移入组件时被触发、mouseExited(MouseEvent e),在鼠标指针溢出组件时被触发。
MouseEvent类的常用方法如下:
getSource():获取触发此次事件的组件对象本身,为Object类型。getButton():获取触发此次事件的按键类型的整型值。getClickCount():获取鼠标单击的次数。
示例代码:
package swing.ActionListeners;
import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class DemoMouseListener extends JFrame {
//本文件演示如何使用鼠标监听
//最好在查看一个事件的效果时注释掉其他 监听的结果在控制台 注意查看
private DemoMouseListener() {
super("鼠标监听程序");
setBounds(400, 300, 400, 300);
setResizable(false);
setLayout(null);
addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) { //mouseClicked()方法监测鼠标单击事件
System.out.println("鼠标点击了");
System.out.println("点击的是" + buttonClicked(e.getButton())); //getButton()方法可以获取哪个键被使用了 返回的是int值 常量
System.out.println("点击了" + e.getClickCount() + "次"); //getClickCount可以获取单击了多少次
}
public void mousePressed(MouseEvent e) { //mousePressed()方法监测鼠标按压事件
System.out.println("鼠标按压:" + buttonClicked(e.getButton())); //注意看下面的成员方法
}
public void mouseReleased(MouseEvent e) { //mouseReleased()方法监测鼠标释放事件
System.out.println("鼠标松开了");
}
public void mouseEntered(MouseEvent e) { //mouseEntered()方法监测鼠标移入组件事件
System.out.println("鼠标移入窗体");
}
public void mouseExited(MouseEvent e) { //mouseExited()方法监测鼠标移出组件事件
System.out.println("鼠标移出窗体");
}
});
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new DemoMouseListener();
}
String buttonClicked(int button) {
switch (button) {
case MouseEvent.BUTTON1: //改代码实现将int值转换成对应的字符串
return "鼠标左键";
case MouseEvent.BUTTON2:
return "鼠标滚轮";
case MouseEvent.BUTTON3:
return "鼠标右键";
}
return "鼠标其他键";
}
}运行结果:

当鼠标在窗体内外移动、点击时,控制台会输出对应信息:
鼠标移入窗体
鼠标移出窗体
鼠标移入窗体
鼠标按压:鼠标左键
鼠标松开了
鼠标点击了
点击的是鼠标左键
点击了1次
鼠标移出窗体
鼠标移入窗体
鼠标移出窗体