سؤال

حسنا، إذا أضفت ActionListener إلى عنصر واجهة المستخدم الرسومية، وهذا هو فقط عنصر أستخدمه ذلك ActionListener مع، هل يهم أي من الأسطر التالية (A، B) أستخدمه للحصول على الحالة المحددة من مربع الاختيار؟

final JCheckBox checkbox = (JCheckBox)this.buildResult.get("cbDebugTick");
checkbox.addActionListener(new ActionListener() {
    @Override public void actionPerformed(ActionEvent event){               
            boolean bChecked =
            // (a) checkbox.isSelected();
            // (b) ((JCheckBox)event.getSource()).isSelected();
            model.setPrintDebugOn(bChecked);
        }
});

من المنطقي لي أنه إذا أضفت ActionListener الاعتراض على عناصر GUI متعددة، ثم يجب أن أستخدم (ب).

وفي (ب)، هل هو موافق للمطرفة العمياء event.getSource() ل JCheckBox, ، لأنني الشخص الذي أضاف مستمع العمل، أو يجب أن أقوم ببرنامج دفاعي وفعل instanceof التحقق من؟

ملاحظة: هذا السؤال هو في سياق مستمعي الأحداث بشكل عام؛ يحتوي Kdgregory على بعض النقاط الجيدة أدناه على وجه التحديد: مربعات الاختيار التي أهميتها تنظر فيها.

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

المحلول

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

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

 @Override public void actionPerformed(ActionEvent event) {                                  
    //your treatment would be in this method, where it would be acceptable to use (a)                  
    onCheckBoxActionPerformed(event)
}

نصائح أخرى

أنا لا أفعل ذلك.

إذا كان النقر فوق مربع الاختيار سيبدأ بعض الإجراءات، فسأعلق ItemListener., ، ثم انظر فقط إلى حالة الاختيار في itemevent..

ومع ذلك، لا تكتسب مربعات الاختيار الإجراءات عادة، فإنها تدير الدولة. لذلك نهج أفضل هو دراسة جميع خانات الاختيار الخاصة بك استجابة لكل ما يطرد الإجراء.


تحرير: بعض التعليق حول القضايا الأكبر التي أثارها المرجع.

أولا، من المهم أن ندرك أن أجزاء كبيرة من الأرجوحة تمثل راحة التنفيذ بدلا من نموذج سلوك متماسك. jcheckbox. و jbutton. ليس لديهم شيء مشترك آخر غير حقيقة أن النقر داخل مساحتها ذات مغزى. ومع ذلك، كلاهما يرث مجردة, ، والتي توفر تفاصيل التنفيذ مثل تسمية الزر. يفترض أيضا أن الأزرار "مضغوطة"، وأن الضغط على زر سيبدأ بعض السلوك المجدي (الإجراء). في حالة Jcheckbox، ومع ذلك، فإن الصحافة الزر ليست مهمة، والتغيير في الحالة هو. يتم الإشارة إلى أن تغيير الحالة إلى itterListener - والتي يتم تعريفها أيضا على التزلج على الرغم من أن التغييرات في الحالة لا معنى لها لأنواع زر أخرى (تقول Javadoc "خانة الاختيار").

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

أخيرا، من منظور قابلية الاستخدام، هناك فرق بين عناصر التحكم التي تحافظ على الدولة، مثل Jcheckbox و Jtextarea، وتلك التي تبدأ الإجراءات، مثل JButton و Jmenuitem. لقد رأيت تطبيقا (Web) حيث ينقلك النقر فوق زر راديو إلى صفحة مختلفة. هذا سيء. حتى إذا كنت تخطط لاستخدام المستمعين داخليا، لتحديث حالة بعض النماذج، يجب عليك أن تسأل نفسك لماذا توفر لك مجموعة عناصر GUI في أنفسهم نموذجا.

للحالة التي يكون فيها المستمع حصري (مثل مستمع Anon)، استخدم (أ).

إذا تم إعادة استخدام المستمع (على سبيل المثال، this هو مثيل ActionListener) سأكتبها على النحو التالي:

@Override
public void actionPerformed(ActionEvent event) {
    Object src = event.getSource();
    if (src == checkbox) {
        boolean bChecked = checkbox.isSelected();
        // ...
    }
}

إذا كان لديك العديد من خانات الاختيار ويتم معالجتها بنفس الطريقة، ثم instanceof من المنطقي.

كنت برمج مع B بشكل دفاعي كما هو خيار أفضل الممارسات. ولكن إذا كنت فقط ستعمل على استخدام الرمز، فلا يوجد سبب لماذا لا يمكنك القيام به. ومع ذلك، تخيل مدى سعادتك مع نفسك إذا عدت إليها في بعض النقاط المستقبلية، فقم بتغيير شيء ما وتجد لك كتابة رمز جيد يمكنك إعادة استخدامه مباشرة ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top