如何为SWT
窗口小部件添加验证?例如。 Text
?
我尝试了以下两种方法(在线发现):
txtPort.addListener(SWT.Verify,new Listener() {
@Override
public void handleEvent(Event event) {
String port = ((Text)event.widget).getText();
try{
int portNum = Integer.valueOf(port);
if(portNum <0 || portNum > 65535){
event.doit = false;
}
}
catch(Exception ex){
event.doit = false;
}
}
});
另外:
txtPort.addVerifyListener(new VerifyListener() {
@Override
public void verifyText(VerifyEvent e) {
String port = ((Text)e.widget).getText();
try{
int portNum = Integer.valueOf(port);
if(portNum <0 || portNum > 65535){
e.doit = false;
}
}
catch(Exception ex){
e.doit = false;
}
}
});
如果我添加一个字符,光标会卡住,我甚至无法将其删除
即使我第一次删除所有内容,光标也会卡住,我无法写任何其他内容
我在这里搞砸了什么?我该怎么做Text
的验证呢?
在这种情况下,我只想接受一个作为端口的号码。
答案 0 :(得分:11)
在实际输入任何文本之前,将调用您正在创建的VerifyListener
。您当前正在检查已输入的文本以查看该值是否有效,但它永远无效,因为尚未输入任何文本。
尝试阅读e.text
的值以查看它是否为整数并使用e.start
和e.end
属性以及您现在拥有的getText()
来查看是否总体新值将介于0到65535之间。
更简单的解决方案可能是创建ModifyListener
,只有在文本小部件的文本包含有效端口号时才启用提交按钮。
你可以尝试类似的东西:
txtPort.addVerifyListener(new VerifyListener() {
@Override
public void verifyText(VerifyEvent e) {
/* Notice how we combine the old and new below */
String currentText = ((Text)e.widget).getText();
String port = currentText.substring(0, e.start) + e.text + currentText.substring(e.end);
try{
int portNum = Integer.valueOf(port);
if(portNum <0 || portNum > 65535){
e.doit = false;
}
}
catch(NumberFormatException ex){
if(!port.equals(""))
e.doit = false;
}
}
});
答案 1 :(得分:6)
我想建议JFace DataBinding。您可以轻松地在文本字段中添加ControlDecorationSupport
,并向用户提供有关出错的指示。
/* with portText being your SWT text control */
IObservableValue textObservable = WidgetProperties.text().observe(portText);
UpdateValueStrategy strategy = new UpdateValueStrategy();
strategy.setBeforeSetValidator(new IValidator() {
@Override
public IStatus validate(Object value) {
Integer portNumber = null;
try {
portNumber = Integer.valueOf((String) value);
} catch (NumberFormatException e) {
return error(e.getMessage() + " is not a number");
}
if (portNumber < 0 || portNumber > 65535) {
return error("Number is out of range");
}
return ok();
}
});
/* with text being the port value in your model */
Binding binding = new DataBindingContext().bindValue(
textObservable,
PojoProperties.value(Model.class, "text").observe(this.model),
strategy, null);
ControlDecorationSupport.create(binding, SWT.TOP | SWT.LEFT);
答案 2 :(得分:0)
(简单)使用java rcp / swt Eclipse中的VerifyEvent输入文本字段或仅输入数字
Text txt_mobile = new Text(grpBasicDetails, SWT.BORDER);
txt_mobile.addVerifyListener(new VerifyListener() {
public void verifyText(VerifyEvent e) {
///// Keycode : backspace==8 (Enable backspace)
if(!(e.character>='0'&&e.character<='9'||e.keyCode==8))
{
txt_mobile.setText("");
//OR
//e.doit=false;
}
btnCancel.setEnabled(true);
}
});