java منهج - معالج الحدث المخصص GWT





حاسب اللغة (8)


إنشاء أحداث GWT مخصصة باستخدام HandlerManger لا ينبغي أن يكون هذا من الصعب ، نلقي نظرة على المثال GwtEventBus @ NingZhang.info أنها بديهية حقيقية. الفئات الرئيسية المستخدمة هي:

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

هل يمكن أن يعطيني أحد مثالاً على إنشاء مجموعة مخصصة من الحدث والمعالج. لنفترض أن لديك كائن شخص تريد أن تعرفه أدواتك إذا تم تحديثه.

يمكنك إنشاء HandlerManager والآن لديك لإنشاء حدث ومعالج. كيف يمكنك تحديد هذه الفئات بحيث يمكنك الاشتراك وإطلاق الأحداث؟

معظم الأحداث تستند إلى DOM ، بينما أريد إنشاء بعض الأحداث والمعاملات المخصصة التي يمكنني إطلاقها خارج أي حدث يستند إلى المتصفح.




أعتقد أن المثال الأكثر اكتمالاً وتفصيلاً في هذا المقال

ويحتوي أيضًا على مثال لمشروع يوضح كيفية الاستخدام الصحيح لتعريف الأحداث المخصصة واستخدام فئة HandlerManager في GWT.




يبدو أنك تريد PropertyChange * الدعم. إلقاء نظرة على gwtx . Google 'gwt PropertyChange' وستحصل على عدة مدونات تشرح كيفية استخدامها.







تعليق واحد إضافي: إذا حاولت القيام بشيء مماثل للتفاعل في تطبيق رئيسي إلى حدث تم إطلاقه من أحد مكونات واجهة المستخدم الرسومية المخصصة (مثل مركب وما إلى ذلك) ، أعتقد أنه يجب عليك توصيل التطبيق الرئيسي بشكل صريح للتعامل مع حدث المكون:

yourComponent.addHandler(this, YourEvent.TYPE);

حيث "هذا" هو الفئة التي تقوم بتطبيق واجهة معالج المخصصة الخاصة بك.




في ما يلي مثال شامل جدًا لإنشاء حدث مخصص ، يتم أخذه حرفيًا من GwtEventSystem Wiki (عندما كان نظام الحدث لا يزال في حاضنة GWT).

هذا هو الحدث الذي يتم تشغيله عندما يصبح المستخدم سعيدًا.

تحديد فئة حدث جديد. يمكنك إضافة بيانات تعريف عشوائية في فئة الحدث. من أجل البساطة ، لن نقوم بتضمين أي منها هنا.

public class HappyEvent extends GwtEvent {
  ...
}

تحديد واجهة معالج وواجهة جديدة لفئة الحدث.

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

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

أضف نوع حدث فريد

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

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

سلك طريقة النار المعالج

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



شكرا لجميع الردود. لقد جاء الزكاة الأقرب إلى إعطائي الإجابة التي أحتاج إليها ، إلا أنني توصلت إلى نموذج أبسط قليلاً.

هدفي الرئيسي هو تجنب استخدام متغير ثابت لبني البيانات الرئيسية. أنا أيضا ضرب مشكلة محاولة معرفة ما إذا كان قد تم استرجاع بنية البيانات الرئيسية بنجاح من قاعدة البيانات في وقت محاولة الوصول إليها وماذا تفعل عندما لا تكون (أي عندما تكون فارغة).

بعد مشاهدة بنية مجموعات أدوات الويب من Google: أفضل الممارسات بالنسبة إلى تصميم فيديو تطبيق GWT من Google IO ، بدت فكرة حافلة الحدث مثالية.

سأقوم بنشر الحل هنا في حال كان يساعد أي شخص آخر.

أولاً ، قم بإنشاء فئة المعالج. لاحظ المرجع إلى فئة الحدث بالفعل:

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

انتقل الآن إلى فئة الحدث. هذا أعطاني أكثر المشاكل:

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;
    }

}

الآن أصبح بإمكاني استخدام فصول "معالج" و "حدث" مثل ذلك عند إعادة تحميل بنية البيانات الرئيسية هذه:

حصل هذا الرمز على بنية البيانات ويريد إبلاغ كل من يستمع بأنه تم تحديثه:

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

هذا الرمز هو تنفيذ الحدث

public class PopulateCategoryHandler implements CategoryChangeHandler {

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

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

}



هذا كيف أفعل ذلك.

        $("input[name='title']").on({
            "change keyup": function(e){
                var slug = $(this).val().split(" ").join("-").toLowerCase();
                $("input[name='slug']").val(slug);
            },
        });




java events gwt javascript-events