سؤال

لدي واجهة مستخدم تنفذ مع الأرجوحة. يقوم أحد المكونات ببعض الأعمال التي قد تستغرق بعض الوقت ، لذلك أستخدمها SwingUtilities.invokeLater. ومع ذلك ، كنت أقرأ بعض التعليمات البرمجية القديمة ووجدت هذا في ActionListener:

if (!SwingUtilities.isEventDispatchThread()) {
    SwingUtilities.invokeLater(new Runnable() {
         public void run() {
             // code X
         }
    });
} else {
   // code X
}

اعتقدت أنه من المنطقي لأنه ينفصل code X من adt. ومع ذلك ، وجدت أنه معرض للخطأ منذ أن استخدمته عدة مرات ، وكلا المرتين نسيت else جزء.

السؤال هو: هل SwingUtilities.isEventDispatchThread() التحقق من الضرورة؟ أو يمكنني افترض أنني لست في EDT و يستخدم دائما invokeLater?

شكرًا جزيلاً.

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

المحلول

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

public static void invokeInDispatchThreadIfNeeded(Runnable runnable) {
    if (EventQueue.isDispatchThread()) {
        runnable.run();
    } else {
        SwingUtilities.invokeLater(runnable);
    }
}

بهذه الطريقة لا تنسى أبدًا else.

أيضا ، بشكل عام في تكرار عدويتك code x هي فكرة سيئة للغاية ، حيث قد تجد لاحقًا أنه يتعين عليك إصلاح أو تحسين هذا الرمز وستفعل ذلك فقط في مكان واحد ، وترك خطأ في الآخر.

نصائح أخرى

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

يجب أن يعرف الرمز حقًا ما إذا كان على EDT أم لا (إذا كان ذلك مناسبًا). لذا java.awt.EventQueue.isDispatchThread يجب أن يترك للتأكيدات.

ببساطة إذا كان لديك على الكود الخاص بك ، قم بإطلاق مؤشر ترابط (أ) بواسطة EDT ، وفي هذا الموضوع (أ) لديك مؤشر ترابط آخر (ب) يتعين عليه تعديل واجهة المستخدم الرسومية ، في هذه الحالة ، عليك استخدام Invokelater على الموضوع (ب (ب ). ومع ذلك ، إذا كان تعديل واجهة المستخدم الرسومية الخاصة بك يقوم بالخيط الأول (أ) ، فليس من الضروري استخدام Invokelater.

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