سؤال

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

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

المحلول

ال مهرجان يحتوي Framework على أداة للكشف عن استخدام التأرجح قبالة EDT. إنه في الأساس عبارة عن إعادة تثبيت. يتم توجيه الإطار نحو الاختبار ، ولكن يمكن استخدام REPAINTMANAGER في وقت النشر.

بدلاً من ذلك ، للتحقق من جميع الأساليب مثل Getters و Petters للوصول فقط على EDT ، يمكنك استخدام SideJ و Weaving Weaving لإضافة نصيحة SwingUtability.isdisaptChthRead () إلى كل طريقة على مكونات Swing الخاصة بك (ومكونات JDK Swing. )

@Aspect
public class EDTCheck {

    @Pointcut("call (* javax.swing..*+.*(..)) || " +
              "call (javax.swing..*+.new(..))")
    public void swingMethods() {}

    @Pointcut("call (* com.mystuff.swing..*+.*(..)) || " +
              "call (com.mystuff.swing..*+.new(..))")
    public void mySwingMethods() {}


    @Pointcut("call (* javax.swing..*+.add*Listener(..)) || " +
              "call (* javax.swing..*+.remove*Listener(..)) || " +
              "call (void javax.swing.JComponent+.setText(java.lang.String))")
    public void safeMethods() {}

    @Before("(swingMethods() || mySwingMethods()) && !safeMethods()")
    public void checkCallingThread(JoinPoint.StaticPart thisJoinPointStatic) {
        if(!SwingUtilities.isDispatchThread()) {
            System.out.println(
                    "Swing single thread rule violation: " 
                    + thisJoinPointStatic);
            Thread.dumpStack();
            // or you might throw an unchecked exception
        }
    }

}

(تم تعديله قليلاً من المقالة - تمت إضافة myswingmethods pointcut ، واستخدم swingutiliites.isdispatchThread (). في الممارسة العملية ، هو نفس eventqueue.isDispatchThread () ولكن التجريد أكثر نظافة.)

نصائح أخرى

صادفت طريقة بسيطة وذكية (وإن لم تكن دليلًا تمامًا على الرصاص) بواسطة Scott Delap فيhttp://today.java.net/pub/a/today/2005/04/19/desktoplive.html.

كما تم تلميح في إجابة مهرجان من قبل MDMA فوق إعادة استخدام مخصصة ، يمكن ببساطة تجاوز الأساليب

addInvalidComponent(JComponent component) 

و

addDirtyRegion(JComponent component, int x, int y, int w, int h)

والاستخدام

SwingUtilities.isEventDispatchThread()

للتحقق مما إذا كنا على AWT ، يمكنك دمج هذا في Junit بسهولة إلى حد ما عن طريق إضافة أ

org.JUnit.Assert.fail("AWT Thread Violation")

في روتين التحقق الخاص بك.

المنطق هنا هو أن معظم عمليات التأرجح (ولكن ليس كلها) تتسبب في إعادة طلاء في نهاية المطاف إلى هذه الأساليب في REPAINTMANAGER حتى نتمكن من التقاطها والقيام بالتحقق لدينا.

ألكساندر بوتوكين لديه جولة جيدة من الطرق المختلفة هنا: http://weblogs.java.net/blog/alexfromsun/archive/2006/02/debugging_swing.html

من وجهة نظر الترميز ، منفصل بوضوح رمز EDT من الرمز غير EDT. يتجنب SwingWorker مثل الطاعون.

لتأكيد أنك على EDT (أدخل ! لإيقاف) ، أضف الخط:

assert java.awt.EventQueue.isDispatchThread();

سوف تحتاج -ea/-enableassertions لهذا لفعل أي شيء. ومع ذلك ، فإنه يعمل في الغالب كتعليق قابل للتنفيذ.

كل ما تحتاجه هو الكود التالي:

void method() {
    if (!SwingUtilities.isEventDispatchThread()) {
       SwingUtilities.invokeAndWait(new Runnable() { public void run() { method(); } );
       return;
    }

    // do method code here, guaranteed to be in EDT
}

أيضا ، باستخدام مستوى نظرًا لأن LAF الخاص بك سوف يساعدك على معرفة المكان الذي لا يتم فيه تنفيذ الأشياء المتعلقة بالأرجوحة على EDT. يحتوي على فحوصات في مكان للتأكد من أن أي أشياء تأرجح تتم على الخيط المناسب ، أو تفشل باستثناء.

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