为什么这段代码有“一次性错误”?

时间:2011-03-06 18:03:46

标签: java gwt event-handling logic

我正在构建一个GWT组件,其行为与stackoverflow和其他站点上的注释框非常相似。我正在尝试为KeyPressChangeONPASTE事件注册听众,这些事件将使用剩余字符数等更新我的状态行。

除了文本区域中实际字符数后面总是一个字符外,它才有效。我将最大字符数设置为10.当我输入第一个字符时,它仍然显示“剩余10个字符”。在我键入第二个字符然后它是一个关闭之前它不更新状态行,它表示在输入第二个字符时剩余9个字符。

当我BACKSPACEDELETE时,它也是一个关闭,当没有字符时,它仍然显示“剩余9个字符”,直到我按下BACKSPACE或{{1}第二次。

我在Windows上的Firefox,Chrome和Internet Explorer中都会遇到这种情况。所以我认为我没有正确注册。

我知道这与事件被解雇时有关,但我花了好几个小时试图诊断这种行为并且已经用完了想法。

以下是我注册事件处理程序的地方,完整代码为BoundedTextAreaWithFeedback

DELETE

以下是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()

2 个答案:

答案 0 :(得分:2)

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

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

好像已经成功了。

以下是working codeCTRL-V,上下文菜单中的粘贴现在也可以使用。

答案 1 :(得分:1)

尝试使用DeferredCommand执行验证码。我认为问题在于,当事件触发时,它们的字符尚未添加到文本区域。在任何挂起的事件处理程序完成之前,DeferredCommand不会执行,允许正确计算文本的长度。

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