2011-03-06 50 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