VerifyListener 和 FocusListener 冲突

Posted

技术标签:

【中文标题】VerifyListener 和 FocusListener 冲突【英文标题】:Conflict between VerifyListener and FocusListener 【发布时间】:2016-12-13 04:52:11 【问题描述】:

有一个 SWT 文本框。我正在为其设置默认文本。

    设置了焦点侦听器,以便当焦点在文本框上时,删除默认文本。

    设置了验证侦听器以确保仅输入字母。

但是,当焦点设置在文本框上时,文本不会设置为空。是什么导致了这个问题?

final Text text = new Text(parent, SWT.NONE);
text.setText("Default");
text.addFocusListener( new FocusAdapter() 
     @Override
     public void focusGained(FocusEvent event) 
           if("Default".equals(text.getText()))
           text.setText("");
           
     
);
text.addVerifyListener( new VerifyListener() 
     @Override
     public void verifyText(VerifyEvent e) 
            e.doit = Verifier.isAlphabet(e.character);
     
 );

【问题讨论】:

【参考方案1】:

Text 已经通过 setMessage 方法支持默认文本。

因此,您可以使用setMessage("Default");,而不是使用setText("Default") 和焦点监听器。

验证侦听器应该可以正常工作。

【讨论】:

【参考方案2】:

当您的焦点侦听器调用text.setText("") 时,将调用验证侦听器。在这种情况下,e.character 的值为 0,因为没有添加任何字符。大概您的 Verifier.isAlphabet 方法正在为此返回 false 并阻止更改发生。

您的验证侦听器不应测试character 值。您应该查看 VerifyEvent text 字段,它会为您提供正在更改的全文(您可能还需要查看 startend 字段)。

【讨论】:

以上是关于VerifyListener 和 FocusListener 冲突的主要内容,如果未能解决你的问题,请参考以下文章

& 和 && 区别和联系,| 和 || 区别和联系

第三十一节:扫盲并发和并行同步和异步进程和线程阻塞和非阻塞响应和吞吐等

shell中$()和 ` `${}${!}${#}$[] 和$(()),[ ] 和(( ))和 [[ ]]

Java基础8---面向对象代码块和继承和this和super和重写和重载和final

Java基础8---面向对象代码块和继承和this和super和重写和重载和final

JS中some()和every()和join()和concat()和pop(),push(),shift(),unshfit()和map()和filter()