VerifyListener 和 FocusListener 之间的冲突

Conflict between VerifyListener and FocusListener

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

  1. 设置焦点侦听器,当焦点位于文本框时,删除默认文本。

  2. 验证侦听器已设置为确保只输入了字母表。

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

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);
     }
 });

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

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

Text 已经通过 setMessage.

方法支持默认文本

因此,您可以使用 setMessage("Default");.

而不是使用 setText("Default") 和焦点侦听器

验证侦听器应该可以正确使用它。