杰瑞科技汇

java的jtextfield

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

java的jtextfield-图1
(图片来源网络,侵删)

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): 选中从 selectionStartselectionEnd 之间的文本。
  • 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 最常见的交互就是监听用户输入事件,主要有两种监听器:

java的jtextfield-图2
(图片来源网络,侵删)

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

密码输入框

JPasswordFieldJTextField 的一个子类,专门用于输入密码,它默认会隐藏输入的字符,用圆点 或星号 代替。

JPasswordField passwordField = new JPasswordField(15);
// 可以设置回显字符,默认是圆点
passwordField.setEchoChar('*'); 

获取密码时,使用 getPassword() 方法,它会返回一个 char[] 数组,而不是 String,这有助于在内存中及时清除敏感信息。

char[] password = passwordField.getPassword();
// 使用完后,立即清空数组
Arrays.fill(password, '0');

对齐方式

  • setHorizontalAlignment(int alignment): 设置文本在文本框中的对齐方式。
    • SwingConstants.LEFT (默认)
    • SwingConstants.CENTER
    • SwingConstants.RIGHT
    • SwingConstants.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 应用的必备技能。

分享:
扫描分享到社交APP
上一篇
下一篇