Java如何将键侦听器事件处理程序添加到JTextField?

在这个小的Swing示例中,我们演示了如何使用java.awt.event.KeyAdapter类来处理文本字段组件的键盘事件。该代码段会将在JTextField组件中键入的字符更改为大写。

此用例的更好方法是改用DocumentFilter类。请参见以下示例,如何将JTextField文本格式化为大写?

package org.nhooo.example.swing;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.HeadlessException;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class UppercaseTextFieldDemo extends JFrame {
    public UppercaseTextFieldDemo() throws HeadlessException {
        initComponents();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new UppercaseTextFieldDemo().setVisible(true));
    }

    protected void initComponents() {
        // 设置默认表单大小,关闭事件和布局管理器
        setSize(250, 250);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        getContentPane().setLayout(new FlowLayout(FlowLayout.LEFT));

        // 为我们的演示应用程序创建标签和文本字段,然后添加
        // 框架内容窗格对象的组件。
        JLabel usernameLabel = new JLabel("Username: ");
        JTextField usernameTextField = new JTextField();
        usernameTextField.setPreferredSize(new Dimension(150, 20));
        getContentPane().add(usernameLabel);
        getContentPane().add(usernameTextField);

        //为文本字段注册一个KeyListener。使用KeyAdapter类
        // 允许我们实施我们要监听的唯一关键监听器事件,
        // 在此示例中,我们使用keyReleased事件。
        usernameTextField.addKeyListener(new KeyAdapter() {
            public void keyReleased(KeyEvent e) {
                JTextField textField = (JTextField) e.getSource();
                String text = textField.getText();
                textField.setText(text.toUpperCase());
            }
        });
    }
}