استدعاء التعليمات البرمجية بعد كل الماوس المستمعين الحدث يتم تنفيذها

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

  •  05-07-2019
  •  | 
  •  

سؤال

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

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

المحلول

أما بالنسبة نويل التعليق:

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

باستخدام SwingUtilities.invokeLater() كنت متأكدا من تنفيذ التعليمات البرمجية بعد كل المستمع تم إخطار.ولكن واحدة من هذه المستمعين قد تؤدي انها وظيفة في فصل الخيط.

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

شبة الكود:

Listener implements MouseListener 
    +mouseClicked( event: MouseEvent ) 
        SwingUtilities.invokeLater( // returns immediately 
              someTask() 
        )

    -someTask()
        // perform some long task.

إذا كان لديك الخاص بك المستمعين كما

 addListener( new Listener() )
 addListener( new Listener() )
 addListener( new Listener() )
 addListener( new ExecuteAtTheEnd() ) 

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

إذا ماذا يمكنك أن تفعل ؟

تحتاج إلى مزامنة استخدام بعض العلم قفل وتنفيذ التعليمات البرمجية الخاصة بك حتى أن العلم لا يستخدم.

قد يكون العداد الذي يتزايد عند المستمع هو وتنفيذ decremented عندما لا:

 Listener implements MouseListener 
    +mouseClicked( event: MouseEvent )
        lockFlagCount++ 
        SwingUtilities.invokeLater( 
              someTask() 
        )

    -someTask()
        // perform some long task.
        lockFlag--

ثم المضي قدما حتى هذا العلم هو الكاذبة:

  ExecuteAtTheEndListener implements MouseListener 

       + mouseClicked( event: MouseEvent ) 
        SwingUtilities.invokeLater( 
              executeAtTheEnd() 
        )
       - executeAtTheEnd() 
            while( logFlagCount > 0 ) 
                wait()

             if( logFlagCount == 0 ) 
                 // continue with the task.                  

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

نصائح أخرى

يتم تنفيذها في نفس الموضوع ( الحدث المرسل الخيط ) .

أن تفعل ما تريد لديك فقط لإضافة المزيد من المستمع يجب أن المستمع الاحتجاج "executeLater" طريقة SwingUtilities فئة.

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

لاختبار ذلك ، إضافة هذا المستمع ونرى ماذا يفعل:

 class MouseListener extends MouseAdapter {
     public void mouseClicked(MouseEvent e)  {
           // System.out.println("If uncommented this would be invoked with the rest of the listners");
           SwingUtilities.invokeLater( new Runnable() {
                public void run() {
                    System.out.println("Invoked after all the listeners were notified");
                }
            }
     }
 }

إنها الماوس المستمع ما كنت قد حصلت.هذا المفهوم هو نفسه بالنسبة لجميع المستمعين الآخرين.

وأعتقد أن ما سوف تحتاج إلى استخدام SwingUtilities.invokeLater() الطريقة التي سوف تحتج على Runnable سبيل المثال على ترابط إرسال الحدث بعد الأخرى واجهة الأحداث تمت معالجتها.

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