ما هي الطريقة الشائعة لبرنامج مستمعي العمل؟

StackOverflow https://stackoverflow.com/questions/2434331

  •  19-09-2019
  •  | 
  •  

سؤال

لقد بدأت للتو في معرفة كيفية استخدام مستمعي العمل. لتفهمي يعمل بالطريقة التالية:

  1. هناك بعض الفئات التي تحتوي على طريقة "addactractener" بشكل افتراضي (على سبيل المثال فئات للأزرار).

  2. باستخدام هذه الطريقة نضيف مستمع عمل إلى كائن. علي سبيل المثال: listenedObject.addActionListener(listeningObject).

  3. عند إجراء إجراء مع "ListudoBject"، سيتم استدعاء طريقة "actionperformed" ل "listeningobject". لذلك، فهذا يعني أنه عندما نقوم ببرمجة فئة ل ListingObject، نحتاج إلى وضع طريقة "actionperformed".

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

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

هل كانت مفيدة؟

المحلول

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

listenedObject.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent evt) {
        // Your action handling code in here
    }
});

وغالبا ما رأيت الناس وضع دعوة إلى طريقة الكائن الذي يحتوي على ListingEdoBject. على سبيل المثال، في مربع حوار يحتوي على زر:

myOkayButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent evt) {
        okayButtonPressed();
    }
});

ثم لاحقا في فئة الحوار:

private void okayButtonPressed() {
    // Do what we need to do
}

نصائح أخرى

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

الطريقة التي وجدتها دائما مفيدة (ل التنقل أغراض) هي إنشاء فئة داخلية مجهولة المفوضة ثم يفوضون إلى الطبقة الخارجية:

listenedObject.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent evt) {
        listenedObject_actionPerformed(evt);
    }
});


private void listenedObject_actionPerformed(ActionEvent evt) {
    //Your handling goes here
}

بعد ذلك، من الأسهل الوصول إلى رمز معالجة الخاص بك في IDE باستخدام بحث هيكلي (CTRL + F12 في الفكرة، CTRL + O في الكسوف).

مشكلة استخدام فئة واحدة (مثل واجهة المستخدم الرسومية MyCoolPanel) كمستمع مشترك إلى مجموعة من مكوناتها (الأزرار وغيرها) هو أن actionPerformed الطريقة ثم لديها الكثير من القبيح if-else مقارنات لمعرفة الخروج أي زر قد تم ضغطها بالفعل - وليس جدا OO على الإطلاق!

بالتأكيد يجب ألا تشعر بالقلق للغاية بشأن أداء جوانب هذا النوع من الأشياء - من المرجح أن تكون ضئيلة في أقصى الحدود! الأمثل المبكر يشتهر شيئا سيئا

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

فئات مجهولة غير قابلة لإعادة الاستخدام.

إعادة التوجيه إلى الكائن الذي يحتوي على ListingEnedObject يؤدي إلى فصول عملاقة يصعب الحفاظ عليها.

حذار تلك الأساليب RemoveActionLostener موجودة لسبب ما. يمكنك تخطي المستمعين تنظفون إذا تموت الكائنات التي تستمع إليها مع الكائن الذي يتعامل مع الأحداث. ولكن إذا كان مكونك يستمع النموذج الذي تم توفيره من المصدر الخارجي، فيجب عليك إضافة مستمعي في addnotify وإزالتها في طرق إعادة الترفيع. وإلا فقد يكون لديك تسرب Memore.

ربما ليس في الوقت الحالي، لكنني أعتقد أنه في أقرب مستقبل (بعد إطلاق Java 7) شيء من هذا القبيل سيكون هذا هو الطريقة الشائعة:

listenedObject.addActionListener ( #{doSmth();} );
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top