سؤال

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

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

المحلول

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

CountDownLatch loginSignal = new CountDownLatch(1);
     ...    // Initialize login frame, giving it loginSignal 
     ...    // execute login frame in another Thread
// This await() will block until we are logged in:
loginSignal.await();

لديك إطار تسجيل الدخول، عند الانتهاء، وتناقص المزلاج:

loginSignal.countDown();

تأكد من عدم وجود وسيلة لإطار تسجيل الدخول الخاص بك للخروج من حيث ينسى انخفاض المزلاج! حالما CountDownLatch يصل 0، يصبح الإطار الرئيسي راوحا.

يمكنك أيضا استخدام Semaphore أو Condition (أو أي من خيارات قليلة أخرى من java.util.concurrent)، ولكن لهذا الغرض، CountDownLatch يبدو أسهل في الاستخدام.

نصائح أخرى

ما يجب أن تفهمه حقا مع التعامل مع التأرجح (وفي الواقع AWT)، هو أنك تحتاج إلى الحفاظ على جميع التفاعل مع مكونات مؤشر ترابط إرسال الأحداث AWT (EDT).

لذلك، قم بتسجيل الدخول خارج EDT. إستخدم new Thread, ، أو أفضل java.util.concurrent.ExecutorService. وبعد عندما تكتشف أنك قمت بتسجيل الدخول، استخدم java.awt.EventQueue.invokeLater للعودة إلى EDT. الفئة الداخلية المجهولة هي كبيرة لالتقاط السياق، وعلى الرغم من بناء جملة الفكر المميز، مما يجعل الرمز أقصر.

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