如何实现SWT Text控件仅允许输入数字且非数字字符完全不显示
问题描述
我想要实现SWT Text控件仅支持输入数字。我已知有现有方案可以实现类似效果,但该方案的表现不符合我的需求:输入非数字字符时,字符会先短暂出现在输入框中再消失,若快速输入123a,整段123a都会被移除。我希望非数字字符完全不会出现在输入框中,请问该需求是否可以实现?
解决方案
这个需求完全可以实现,核心是使用SWT原生提供的VerifyListener监听器,该监听器会在输入内容实际写入Text控件之前触发,提前拦截非法输入即可避免字符闪现、合法内容被连带删除的问题。
示例代码如下(仅支持正整数输入):
import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.events.VerifyListener; // 初始化Text控件 Text numberText = new Text(parentContainer, SWT.BORDER); // 添加校验监听器 numberText.addVerifyListener(event -> { // 放行退格、删除、剪切等无新字符输入的操作 if (event.text.isEmpty()) { return; } // 校验即将插入的所有字符是否都是数字,不符合则直接拦截 event.doit = event.text.matches("[0-9]+"); });
如果需要适配更多输入场景,可以自行调整校验规则:
- 支持负数:正则调整为
[0-9\\-]+,同时额外限制减号仅能出现在文本首位 - 支持小数:正则调整为
[0-9\\.]+,同时新增逻辑判断当前Text控件中已存在的小数点数量,避免重复输入小数点 - 支持自定义位数限制:可在校验逻辑中增加当前文本长度判断,超过指定长度直接拦截
内容的提问来源于stack exchange,提问作者adi.neag
相关产品推荐
相关产品推荐

