2011-03-06 45 views
2

我正在构建一个GWT组件,其行为非常像这里在stackoverflow和其他网站上的评论框。我试图注册监听器KeyPressChangeONPASTE事件,将更新我的剩余字符数状态行等为什么此代码有“一次性错误”?

它的工作原理,除了它始终是落后于文本区域中的字符的实际数目的一个字符。我将最大字符数设置为10.当我输入第一个字符时,仍然会显示“剩余10个字符”。它不更新状态行,直到我键入第二个字符,然后它是一个关闭,它表示键入第二个字符时剩余9个字符。

当我BACKSPACEDELETE,它也是一关,当没有字符,还在说“剩下的9个字”,直到我按下BACKSPACEDELETE第二次。

我在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; 
} 

回答

2

我刚刚开始添加每个addXXXHandler(),直到有人工作。

this.textArea.addKeyUpHandler(new KeyUpHandler() 
{ 
    public void onKeyUp(final KeyUpEvent event) 
    { 
     outer.validate(); 
    } 
}); 

似乎已经做到了。

这里是working code,CTRL-V和从上下文菜单粘贴也现在工作。

+0

这是有效的,因为字母不会被添加到TextArea直到密钥被释放。 – 2011-03-06 20:09:33

1

尝试使用DeferredCommand来执行验证码。我认为问题在于,当事件触发时,他们的字符是还没有添加到文本区域。直到任何待处理的事件处理程序完成后,DeferredCommand才会执行,从而允许正确计算文本的长度。

有关使用DeferredCommand的示例,请参阅this question

+0

感谢您的回答,它确实间接地解决了我从上下文菜单中粘贴的另一个问题,在GWT 2.2.x中DeferredCommand是'deprecated'我使用了[Scheduler.scheduleDeferred()](http:// google- web-toolkit.googlecode.com/svn/javadoc/2.2/com/google/gwt/core/client/Scheduler.html#scheduleDeferred%28com.google.gwt.core.client.Scheduler.ScheduledCommand%29)获取状态当从上下文菜单中粘贴时发生更新。但它确实让我走上了另一个问题的正确轨道。 – 2011-03-06 19:03:41

+0

太棒了!听到那个消息很开心。从1.7开始就没有使用过GWT,疯狂的事情变化有多快。 :) – 2011-03-06 19:24:24

+0

我也是,上次我使用的是1.3.x :-) – 2011-03-06 19:57:41