JTextField 是 Java Swing 工具包中的一个核心组件,它代表一个单行的文本输入框,用户可以在其中输入、编辑和显示文本,它是构建图形用户界面中最常用的组件之一。

JTextField 的基本创建和用法
创建一个 JTextField 非常简单。
示例:创建一个基本的文本框
import javax.swing.*;
import java.awt.*;
public class BasicTextFieldExample {
public static void main(String[] args) {
// 1. 创建窗口
JFrame frame = new JFrame("JTextField 基本示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 150);
frame.setLayout(new FlowLayout()); // 使用流式布局
// 2. 创建 JTextField
// 构造函数1: 指定列数
JTextField textField1 = new JTextField(20); // 列宽为20
// 构造函数2: 指定初始文本
JTextField textField2 = new JTextField("请输入文本");
// 构造函数3: 指定初始文本和列数
JTextField textField3 = new JTextField("默认文本", 15);
// 3. 将组件添加到窗口
frame.add(new JLabel("列数为 20:"));
frame.add(textField1);
frame.add(new JLabel("带初始文本:"));
frame.add(textField2);
frame.add(new JLabel("带初始文本和列数:"));
frame.add(textField3);
// 4. 显示窗口
frame.setVisible(true);
}
}
代码解释:
JFrame: 窗口。FlowLayout(): 一种简单的布局管理器,组件从左到右、从上到下依次排列。new JTextField(20): 创建一个JTextField,参数20表示它大约能显示20个英文字符的宽度,这并不限制输入的字符数,只是影响其显示宽度。new JLabel: 用于在文本框旁边添加标签,说明其用途。
常用方法
JTextField 提供了丰富的方法来操作和获取其内容。
获取和设置文本
getText(): 获取文本框中的当前内容。setText(String text): 设置文本框中的内容。
JTextField nameField = new JTextField(20);
nameField.setText("张三"); // 设置文本
String name = nameField.getText(); // 获取文本,name 的值为 "张三"
获取和设置光标位置
getCaretPosition(): 获取光标的当前位置(从0开始)。setCaretPosition(int position): 将光标移动到指定位置。
JTextField field = new JTextField("Hello World");
field.setCaretPosition(5); // 光标会移动到 "Hello World" 的 'W' 前面
选择文本
selectAll(): 选中所有文本。select(int selectionStart, int selectionEnd): 选中从selectionStart到selectionEnd之间的文本。getSelectedText(): 获取当前选中的文本。getSelectionStart()/getSelectionEnd(): 获取当前选中的起始和结束位置。
JTextField field = new JTextField("这是一个测试文本");
field.selectAll(); // 选中全部文本
String selected = field.getSelectedText(); // selected 的值为 "这是一个测试文本"
是否可编辑
setEditable(boolean b): 设置文本框是否可编辑,设置为false时,文本框变为只读。
JTextField readOnlyField = new JTextField("只读文本");
readOnlyField.setEditable(false); // 用户将无法修改此文本框的内容
清空文本
setText("")或setText(null)的效果相同,都可以清空文本框。setText("")更为直观。
JTextField field = new JTextField("一些内容");
field.setText(""); // 清空文本框
事件处理
JTextField 最常见的交互就是监听用户输入事件,主要有两种监听器:

ActionListener (动作监听器)
当用户在文本框中按下 Enter 键 时,会触发 ActionListener,这对于提交表单或执行搜索等操作非常常见。
JTextField searchField = new JTextField(20);
searchField.addActionListener(e -> {
String searchTerm = searchField.getText();
System.out.println("搜索内容: " + searchTerm);
// 在这里执行搜索逻辑
});
DocumentListener (文档监听器)
当你需要实时响应文本的每一次变化(比如输入、删除、粘贴)时,应该使用 DocumentListener,它比 ActionListener 更敏感。
DocumentListener 有三个方法:
insertUpdate(): 当文本被插入时调用。removeUpdate(): 当文本被删除时调用。changedUpdate(): 当文本属性(如样式)改变时调用(对于普通JTextField,这个方法很少被调用)。
示例:实时显示字符数
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
public class DocumentListenerExample {
public static void main(String[] args) {
JFrame frame = new JFrame("实时字符计数");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
JTextField textField = new JTextField("在此输入...", 20);
JLabel countLabel = new JLabel("字符数: 0");
// 添加 DocumentListener
textField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
updateCount();
}
@Override
public void removeUpdate(DocumentEvent e) {
updateCount();
}
@Override
public void changedUpdate(DocumentEvent e) {
// 对于普通 JTextField,通常不需要这个方法
updateCount();
}
private void updateCount() {
countLabel.setText("字符数: " + textField.getText().length());
}
});
frame.add(textField, BorderLayout.CENTER);
frame.add(countLabel, BorderLayout.SOUTH);
frame.pack(); // 自动调整窗口大小以适应组件
frame.setVisible(true);
}
}
高级用法与技巧
输入验证
有时候你希望用户只能输入特定类型的内容(如数字),你可以通过监听 DocumentListener 并结合 DocumentFilter 来实现。
简单示例:只允许输入数字
JTextField numberField = new JTextField(10);
// 使用 DocumentFilter 来限制输入
((PlainDocument) numberField.getDocument()).setDocumentFilter(new DocumentFilter() {
@Override
public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
// 如果输入的是数字,则允许插入
if (string.matches("\\d+")) {
super.insertString(fb, offset, string, attr);
}
}
@Override
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
// 如果替换的是数字,则允许替换
if (text.matches("\\d+")) {
super.replace(fb, offset, length, text, attrs);
}
}
});
密码输入框
JPasswordField 是 JTextField 的一个子类,专门用于输入密码,它默认会隐藏输入的字符,用圆点 或星号 代替。
JPasswordField passwordField = new JPasswordField(15);
// 可以设置回显字符,默认是圆点
passwordField.setEchoChar('*');
获取密码时,使用 getPassword() 方法,它会返回一个 char[] 数组,而不是 String,这有助于在内存中及时清除敏感信息。
char[] password = passwordField.getPassword(); // 使用完后,立即清空数组 Arrays.fill(password, '0');
对齐方式
setHorizontalAlignment(int alignment): 设置文本在文本框中的对齐方式。SwingConstants.LEFT(默认)SwingConstants.CENTERSwingConstants.RIGHTSwingConstants.LEADING(与组件的左侧对齐,对于从左到右的语言等同于 LEFT)SwingConstants.TRAILING(与组件的右侧对齐,对于从左到右的语言等同于 RIGHT)
JTextField rightAlignedField = new JTextField(10);
rightAlignedField.setHorizontalAlignment(SwingConstants.RIGHT);
rightAlignedField.setText("123.45");
| 功能 | 方法/类 | 描述 |
|---|---|---|
| 创建 | new JTextField(列数) |
创建一个指定宽度的单行文本框。 |
| 获取文本 | getText() |
获取文本框中的全部内容。 |
| 设置文本 | setText(String) |
设置文本框的内容。 |
| 光标操作 | setCaretPosition(int) |
设置光标位置。 |
| 文本选择 | selectAll(), getSelectedText() |
选择和获取选中的文本。 |
| 只读模式 | setEditable(false) |
将文本框设置为不可编辑。 |
| Enter键事件 | addActionListener() |
监听用户按下Enter键的事件。 |
| 实时输入事件 | addDocumentListener() |
监听文本的每一次插入、删除变化。 |
| 密码输入 | JPasswordField |
用于输入密码,会隐藏输入的字符。 |
| 文本对齐 | setHorizontalAlignment() |
设置文本在框内的对齐方式(左、中、右)。 |
| 输入验证 | DocumentFilter |
通过过滤输入来限制用户只能输入特定内容。 |
JTextField 是 Swing 开发中非常基础且重要的组件,熟练掌握它的用法是构建交互式 GUI 应用的必备技能。
