GWT:TextField的拖放事件?

时间:2013-03-21 17:15:52

标签: java gwt drag-and-drop textfield

我想知道如何监听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);
    }
}

2 个答案:

答案 0 :(得分:0)

TextBox应该触发ChangeEvent(或ValueChangeEvent - 目前不知道)。所以你可以在构造函数中轻松地做这样的事情:

this.addChangeHandler(new ChangeHandler ...

如果这还不够,您还可以收听Focus事件。

答案 1 :(得分: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,所以它在这个地方并没有真正的帮助。