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

SWT中如何禁止用户在文本框固定后缀之后输入字符

SWT文本框固定后缀仅允许前缀区域输入实现方案

实现思路

核心通过SWT的VerifyListener校验文本修改操作,所有涉及到固定后缀区域的修改都会被拦截,仅允许用户在后缀之前的前缀区域进行输入、删除、替换等操作。

完整实现代码

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class Test {
    // 自定义固定后缀
    private static final String SUFFIX = "end";

    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setSize(300, 200);
        shell.setText("固定后缀文本框示例");

        final Text text = new Text(shell, SWT.BORDER);
        text.setBounds(50, 50, 200, 30);
        // 初始化默认显示后缀
        text.setText(SUFFIX);
        // 初始光标定位到后缀最前方,方便用户直接输入
        text.setSelection(0);

        text.addVerifyListener(new VerifyListener() {
            @Override
            public void verifyText(VerifyEvent e) {
                int suffixLength = SUFFIX.length();
                String currentText = text.getText();
                // 计算当前文本中后缀的起始索引
                int suffixStartIndex = currentText.length() - suffixLength;

                // 校验修改范围是否触及后缀区域,触及则禁止该操作
                if (e.start > suffixStartIndex || e.end > suffixStartIndex) {
                    e.doit = false;
                }
            }
        });

        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }
}

逻辑说明

  1. VerifyListener是SWT文本组件的预修改校验监听器,会在文本实际修改前触发,我们可以通过设置e.doit = false拦截非法修改
  2. 每次校验时先计算当前文本中后缀的起始索引:当前文本长度 - 后缀长度
  3. 校验修改操作的起始/结束位置是否超过后缀起始索引:只要修改范围涉及到后缀区域就直接拦截
  4. 该逻辑自动覆盖所有操作场景:包括输入、删除、粘贴、全选替换等,都不会破坏末尾的固定后缀

可选优化

如果需要提升用户体验,可以增加焦点监听,用户每次点击文本框时自动把光标定位到前缀末尾:

text.addFocusListener(new FocusAdapter() {
    @Override
    public void focusGained(FocusEvent e) {
        int suffixStartIndex = text.getText().length() - SUFFIX.length();
        text.setSelection(suffixStartIndex);
    }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:57:00