Skip to main content

GWT Custom Event Handler



Can someone give me an example of creating a custom set of an Event and a Handler. Say you have a Person object that you want your widgets to know if it got updated.





You create a HandlerManager and now you have to create an Event and a Handler. How would you define those classes so that you can subscribe and fire events?





Most of the Events are DOM based, while I want to create some custom events and handlers that I can fire outside of any browser-based event.


Comments

  1. Here's a pretty comprehensive example of creating a custom event, taken verbatim from the GwtEventSystem Wiki (when the event system was still in GWT's incubator).

    This is an event that is triggered when the user becomes happy.

    Define a new event class. You can add arbitrary metadata in the event class. For simplicity, we will not include any here though.

    public class HappyEvent extends GwtEvent {
    ...
    }


    Define a new handler and marker interface for the event class.

    interface HappyHandler extends EventHandler {
    public void onHappiness(HappyEvent event);
    }

    interface HasHappyEvents {
    public HandlerRegistration addHappyHandler(HappyHandler handler);
    }


    Add a unique event type

    class HappyEvent extends AbstractEvent{
    public static AbstractEvent.Key KEY = new AbstractEvent.Key(){...}

    public GwtEvent.Key getKey(){
    return KEY;
    }
    ...
    }


    Wire up the handler's fire method

    class HappyEvent extends GwtEvent {
    static Key<HappyEvent,HappyHandler> KEY = new Key<HappyEvent,HappyHandler>(){
    protected void fire(HappyHandler handler, HappyEvent event) {
    handler.onHappiness(event);
    };
    ...
    }

    ReplyDelete
  2. Thanks for all the responses. Zakness came the closest to giving me the answer I needed, however, I came up with a slightly simpler model.

    My main goal was to avoid using a static variable to my main data structure. I also hit the problem of trying to figure out if that main data structure was successfully retrieved from the database at the time of trying to access it and what to do when it's not (i.e. when it's null).

    After watching the Google Web Toolkit Architecture: Best Practices For Architecting Your GWT App video from Google IO, the Event Bus idea seemed perfect.

    I'll post my solution here in case it helps anyone else out.



    First, create the Handler class. Note the reference to the Event class already:

    public interface CategoryChangeHandler extends EventHandler {
    void onCategoryChange(CategoryChangeEvent event);
    }


    Now on to the Event class. This gave me the most trouble:

    public class CategoryChangeEvent extends GwtEvent<CategoryChangeHandler> {

    private final List<Category> category;

    public CategoryChangeEvent(List<Category> category) {
    super();
    this.category = category;
    }

    public static final Type<CategoryChangeHandler> TYPE = new Type<CategoryChangeHandler>();

    @Override
    protected void dispatch(CategoryChangeHandler handler) {
    handler.onCategoryChange(this);
    }

    @Override
    public com.google.gwt.event.shared.GwtEvent.Type<CategoryChangeHandler> getAssociatedType() {
    return TYPE;
    }

    public List<Category> getCategories(){
    return category;
    }

    }


    Now I am able to use these Handler and Event classes like so when this main data structure gets reloaded:

    This code got the data structure and want to notify everyone who is listening that it got updated:

    CategoryChangeEvent event = new CategoryChangeEvent(result);
    eventBus.fireEvent(event);


    This code is an implementation of the Event

    public class PopulateCategoryHandler implements CategoryChangeHandler {

    @Override
    public void onCategoryChange(CategoryChangeEvent event) {
    tearDownCategories();

    List<Category> categories = event.getCategories();
    populateCategories(categories);
    }

    }

    ReplyDelete
  3. Here is an example of this over on Alex Reid's blog, including a link to an operational code example. The example fills in some of the fuzzy bits and, along with Nick's example here, helps clarify getting started with architecting an event bus in your gwt application.

    ReplyDelete
  4. I think that the most complete and detailed example is in this article

    It contains also an example project that shows exactly how to properly use define custom events and use GWT's HandlerManager class.

    ReplyDelete
  5. Create custom GWT events using the HandlerManger shouldn't be this hard, take a look at the example GwtEventBus @ NingZhang.info it is real intuitive. The key classes used are:


    com.google.gwt.event.shared.HandlerManager
    com.google.gwt.event.shared.GwtEvent
    com.google.gwt.event.shared.EventHandler

    ReplyDelete
  6. Sounds like you want PropertyChange* support. Have a look at gwtx. Google 'gwt PropertyChange' and you will get multiple blogs that explain how to use it.

    ReplyDelete
  7. You might want to have a look at the ValueChangeHandler and ValueChangeEvent in GWT 1.6. Those might work for what you're trying to do.

    ReplyDelete
  8. One additional comment: if you try do to something similar to react in a main application to an event fired from a custom GUI component (like a composite etc.), I think you have to wire the main app explicitly to handle the component's event:

    yourComponent.addHandler(this, YourEvent.TYPE);


    where "this" is the class that implements your custom handler interface.

    ReplyDelete

Post a Comment

Popular posts from this blog

Why is this Javascript much *slower* than its jQuery equivalent?

I have a HTML list of about 500 items and a "filter" box above it. I started by using jQuery to filter the list when I typed a letter (timing code added later): $('#filter').keyup( function() { var jqStart = (new Date).getTime(); var search = $(this).val().toLowerCase(); var $list = $('ul.ablist > li'); $list.each( function() { if ( $(this).text().toLowerCase().indexOf(search) === -1 ) $(this).hide(); else $(this).show(); } ); console.log('Time: ' + ((new Date).getTime() - jqStart)); } ); However, there was a couple of seconds delay after typing each letter (particularly the first letter). So I thought it may be slightly quicker if I used plain Javascript (I read recently that jQuery's each function is particularly slow). Here's my JS equivalent: document.getElementById('filter').addEventListener( 'keyup', function () { var jsStart = (new Date).getTime()...

Is it possible to have IF statement in an Echo statement in PHP

Thanks in advance. I did look at the other questions/answers that were similar and didn't find exactly what I was looking for. I'm trying to do this, am I on the right path? echo " <div id='tabs-".$match."'> <textarea id='".$match."' name='".$match."'>". if ($COLUMN_NAME === $match) { echo $FIELD_WITH_COLUMN_NAME; } else { } ."</textarea> <script type='text/javascript'> CKEDITOR.replace( '".$match."' ); </script> </div>"; I am getting the following error message in the browser: Parse error: syntax error, unexpected T_IF Please let me know if this is the right way to go about nesting an IF statement inside an echo. Thank you.