我正在构建一个 GWT 组件,其行为与 stackoverflow 和其他网站上的评论框非常相似。我正在尝试注册 KeyPress
、Change
和 ONPASTE
事件的监听器,这些事件将更新我的状态行以及剩余字符数等。
它可以工作,只是它总是比文本区域中的实际字符数晚一个字符。我将最大字符数设置为 10。当我键入第一个字符时,它仍然显示“剩余 10 个字符”。它不会更新状态行,直到我键入第二个字符,然后它是一次性的,它说当键入第二个字符时还剩下 9 个字符。
当我BACKSPACE
或DELETE
时,它也是一次性的,当没有字符时它仍然显示“剩余9个字符”,直到我按BACKSPACE
或再次删除
。
我在 Windows 上的 Firefox、Chrome 和 Internet Explorer 中都遇到了此问题。所以我认为我没有正确注册一些东西。
我知道这与事件被触发时有关,但我花了几个小时试图诊断这种行为,但已经没有想法了。
这里是我注册事件处理程序的地方,完整的代码是 BoundedTextAreaWithFeedback .
private void registerHandlers()
{
final BoundedTextAreaWithFeedback outer = this;
this.textArea.addChangeHandler(new ChangeHandler()
{
public void onChange(final ChangeEvent changeEvent)
{
outer.validate();
}
});
this.textArea.addKeyPressHandler(new KeyPressHandler()
{
public void onKeyPress(final KeyPressEvent keyPressEvent)
{
outer.validate();
}
});
this.panel.addFocusHandler(new FocusHandler()
{
public void onFocus(final FocusEvent focusEvent)
{
outer.textArea.setFocus(true);
}
});
// capture paste events
this.textArea.sinkEvents(Event.ONPASTE);
}
这是 validate()
方法。
private boolean validate()
{
final boolean isValid;
final int len = this.textArea.getText().length();
if (len < this.minLength)
{
this.status.setText("Enter at least " + this.minLength + " characters.");
this.status.setStyleName("input-status-underflow");
isValid = false;
}
else if (len > this.maxLength)
{
this.status.setText(this.maxLength - len + " characters remaining");
this.status.setStyleName("input-status-overflow");
isValid = false;
}
else
{
this.status.setText(this.maxLength - len + " characters remaining");
this.status.setStyleName("input-status-ok");
isValid = true;
}
return isValid;
}
最佳答案
我刚刚开始添加每个 addXXXHandler()
直到其中一个起作用。
this.textArea.addKeyUpHandler(new KeyUpHandler()
{
public void onKeyUp(final KeyUpEvent event)
{
outer.validate();
}
});
看来已经成功了。
这是working code 、CTRL-V
和从上下文菜单粘贴现在也可以使用。
关于java - 为什么此代码有 "one off error"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5212338/