2013-03-21 183 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