2013-03-21 188 views
0

我想知道如何偵聽TextField的丟棄事件。我需要攔截那些事件才能進行價值檢查。GWT:TextField的拖放事件?

我寫了一個擴展的TextBox,它激發了TextChangeEvents。但是,當我將文本放入文本字​​段時,我沒有收到onBrowserEvent(Event event)方法的調用。

任何提示?

public class ExtendedTextBox extends TextBox { 

    /** 
    * Creates an empty extended text box. 
    */ 
    public ExtendedTextBox() { 
     super(); 

     // Catch the browser events. 
     sinkEvents(Event.ONKEYUP); 
     sinkEvents(Event.ONPASTE); 

    } 

    @Override 
    public void onBrowserEvent(Event event) { 
     super.onBrowserEvent(event); 
     System.out.println(event.getTypeInt()); 

     switch (event.getTypeInt()) { 
      case Event.ONKEYUP: 
      case Event.ONPASTE: { 
      // Fire the event after the text box shows the new data. 
      Scheduler.get().scheduleDeferred(new ScheduledCommand() { 

       @Override 
       public void execute() { 
        fireEvent(new TextChangeEvent(ExtendedTextBox.this.getText())); 
       } 
      }); 
      break; 
     } 
     default: 
     } 
    } 

    /** 
    * Add a given {@link TextChangeEventHandler} to the widget. 
    * 
    * @param handler 
    *   the handler 
    * @return {@link HandlerRegistration} used to remove the handler 
    */ 
    public HandlerRegistration addTextChangeEventHandler(TextChangeEventHandler handler) { 
     return addHandler(handler, TextChangeEvent.TYPE); 
    } 
} 
+0

我不明白,目標是在文本框中捕獲拖放事件,或捕獲文本框可能具有的任何修改? – 2013-03-22 09:31:56

回答

0

感謝您的幫助。我今天自己想清楚了,它很簡單。我沒有注意到,已經有DropHandler

您可以在構造函數中,例如這樣做:

addDropHandler(new DropHandler() { 

    @Override 
    public void onDrop(DropEvent event) { 
     if(!event.getDataTransfer().getData("text/plain").isEmpty()) { 
      Scheduler.get().scheduleDeferred(new ScheduledCommand() { 

       @Override 
       public void execute() { 
        fireEvent(new TextChangeEvent(ExtendedTextBox.this.getText())); 
       } 
      }); 
     } 

    } 
}); 

爲了防止TextField的默認行爲,只需添加event.preventDefault();。現在你可以通過調用event.getDataTransfer().getData("text/plain")得到輸入,並做你的輸入驗證等。

並且作爲副作用,onBrowserEvent(Event event)方法現在通過將某些東西放入文本字​​段中來調用。但是int類型是-1,所以它在這個地方並不是很有用。

0

一個文本框應該解僱一個ChangeEvent(或ValueChangeEvent - 不知道此刻)。所以,你可以很容易地做這樣的事情您的構造函數中:

this.addChangeHandler(new ChangeHandler ... 

如果這還不夠,你還可以聽Focus事件。

+0

dom'ChangeEvent'和邏輯'ValueChangeEvent'只會在模糊後才顯示出來,這可能會或可能不會足夠好... – 2013-03-21 19:30:14

+0

但據我所知,沒有其他可能性來識別內部的某種更改文本框。就JavaScript而言,它就像*右鍵單擊 - >粘貼*或* ctrl + v *。 ... HTML5 DropEvent應該是不可能的,因爲沒有真正的* Element *來響應。或者我錯了? – 2013-03-21 20:44:49

+0

尚未對此進行測試,但我不確定 - 儘管發現ONPASTE未熄滅,但這並不會讓我感到驚訝。 HTML5 dnd_seems_好像它應該可以工作,因爲它只需要一個元素來監聽 - 給它一些drop data的東西,它可以處理來自瀏覽器外部的文件,這些文件也不是元素。一個(醜陋的聽起來)的想法可能是偵聽鼠標上移事件,並檢查字段的.getCurrentValue()是否改變。我在評論中的主要原因是澄清,雖然是的,那些會開火,他們不會立即開火。 – 2013-03-21 21:49:56