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(); } }
逻辑说明
VerifyListener是SWT文本组件的预修改校验监听器,会在文本实际修改前触发,我们可以通过设置e.doit = false拦截非法修改- 每次校验时先计算当前文本中后缀的起始索引:
当前文本长度 - 后缀长度 - 校验修改操作的起始/结束位置是否超过后缀起始索引:只要修改范围涉及到后缀区域就直接拦截
- 该逻辑自动覆盖所有操作场景:包括输入、删除、粘贴、全选替换等,都不会破坏末尾的固定后缀
可选优化
如果需要提升用户体验,可以增加焦点监听,用户每次点击文本框时自动把光标定位到前缀末尾:
text.addFocusListener(new FocusAdapter() { @Override public void focusGained(FocusEvent e) { int suffixStartIndex = text.getText().length() - SUFFIX.length(); text.setSelection(suffixStartIndex); } });
内容的提问来源于stack exchange,提问作者SanjiSqurt
相关产品推荐
相关产品推荐

