You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让TextFormatter仅在文本框获得焦点时生效?

让TextFormatter仅在文本框获得焦点时生效的解决方案

嘿,这个需求很实用嘛!要让你的输入长度限制逻辑只在文本框获得焦点(也就是用户正在编辑的时候)才生效,核心就是根据焦点状态动态控制TextFormatter的行为。下面给你两种简单易实现的方案:

方案一:监听焦点事件,动态切换TextFormatter

这种方式的思路是:把你的长度限制Formatter抽成独立变量,然后给文本框加个焦点监听器,当用户点击进去编辑(获得焦点)时启用它,失去焦点时就移除,这样非编辑状态下的内容修改(比如代码赋值)就不受限制了。

// 先把你的自定义长度限制Formatter抽出来,方便复用
TextFormatter<String> lengthLimitFormatter = new TextFormatter<>(change -> {
    int maxLength = 100;
    if (change.isAdded()) {
        if (change.getControlNewText().length() > maxLength) {
            if (change.getText().length() == 1) {
                change = null;
                System.out.println("Reached max!");
            } else {
                int allowedLength = maxLength - change.getControlText().length();
                change.setText(change.getText().substring(0, allowedLength));
                System.out.println("Cut paste!");
            }
        }
    }
    if (change != null) {
        System.out.println("Mail checking...");
    }
    return change; // 这里一定要返回change,不然Formatter不会生效哦!
});

// 给邮箱文本框添加焦点状态监听
mailTextField.focusedProperty().addListener((observable, oldFocused, newFocused) -> {
    if (newFocused) {
        // 获得焦点时,启用长度限制
        mailTextField.setTextFormatter(lengthLimitFormatter);
    } else {
        // 失去焦点时,移除限制(也可以设置成默认Formatter)
        mailTextField.setTextFormatter(null);
    }
});

方案二:在Formatter回调内直接判断焦点状态

如果不想来回切换Formatter,也可以直接在你的限制逻辑开头加个判断:只有当文本框获得焦点时,才执行长度限制;没焦点的话直接放行所有修改。

mailTextField.setTextFormatter(new TextFormatter<>(change -> {
    // 先检查文本框是否获得焦点,没焦点直接跳过限制逻辑
    if (!mailTextField.isFocused()) {
        return change;
    }

    int maxLength = 100;
    if (change.isAdded()) {
        if (change.getControlNewText().length() > maxLength) {
            if (change.getText().length() == 1) {
                change = null;
                System.out.println("Reached max!");
            } else {
                int allowedLength = maxLength - change.getControlText().length();
                change.setText(change.getText().substring(0, allowedLength));
                System.out.println("Cut paste!");
            }
        }
    }
    if (change != null) {
        System.out.println("Mail checking...");
    }
    return change;
}));

小提醒

  • 注意原来的代码里漏掉了return change;,这个是TextFormatter生效的关键,一定要补上!
  • 如果需要在文本框失去焦点时做额外操作(比如验证邮箱格式),可以在焦点监听器里添加对应的逻辑。

内容的提问来源于stack exchange,提问作者Alyona

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:03:47