java - 为什么此代码有 "one off error"?

标签 java gwt event-handling logic

我正在构建一个 GWT 组件,其行为与 stackoverflow 和其他网站上的评论框非常相似。我正在尝试注册 KeyPressChangeONPASTE 事件的监听器,这些事件将更新我的状态行以及剩余字符数等。

它可以工作,只是它总是比文本区域中的实际字符数晚一个字符。我将最大字符数设置为 10。当我键入第一个字符时,它仍然显示“剩余 10 个字符”。它不会更新状态行,直到我键入第二个字符,然后它是一次性的,它说当键入第二个字符时还剩下 9 个字符。

当我BACKSPACEDELETE时,它也是一次性的,当没有字符时它仍然显示“剩余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 codeCTRL-V 和从上下文菜单粘贴现在也可以使用。

关于java - 为什么此代码有 "one off error"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5212338/

相关文章:

java - JPA 和 EJB 延迟初始化字段

Java : HashSet vs. 哈希表

java - 如何将字符串文本添加到 orElse 和 .map

java - 添加对 SuggestBox 的关注?

android - 需要有关 Android 轨迹球事件的帮助

java - 如何防止 "Broken pipe"关闭我的 tomcat 网站?

java - GXT 3 ToggleButtonCell 不更新数据存储

GWT - 弹出位置

javascript - bool 函数来了解鼠标按钮的位置

JavaScript 事件监听器测验