سؤال

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

/*
 * This makes the updating content item automatically scroll
 * into view if it is off the viewport.
 */
public void contentsChanged(final ListDataEvent evt) {
    if (!EventQueue.isDispatchThread()) {
        /**
          * Make sure the scrolling happens in the graphics "dispatch" thread.
          */
        EventQueue.invokeLater(new Runnable() {
            public void run()  {
               contentsChanged(evt);
            }
        });
    }
    if (playbackInProgress) {
        int index = evt.getIndex0();
        currentContentList.ensureIndexIsVisible(index);
    }
}

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

هل هناك أي شيء آخر أحتاج إلى البحث عنه لإيقاف رسم هذه الأشياء خارج منطقة القطع الخاصة بها؟

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

المحلول

هل حاولت تمكين التخزين المؤقت المزدوج بشكل صريح على قائمة JList و/أو المكونات التي ترسمها؟(مع:setDoubleBuffered(boolean aFlag))

فكرة أخرى هي أنك قد بحاجة إلى الخروج من الوظيفة فورًا بعد التفويض إلى EDT.الطريقة التي تمت بها كتابة الكود الخاص بك، يبدو أن التحديث سيحدث في كلا الموضوعين إذا ContentChanged يتم استدعاؤه من مؤشر ترابط غير EDT.تسجيل الدخول أولا if (أو قم بتعيين نقطة توقف في if -- ولكن لا في التشغيل - يجب أن يساعد في تحديد ما إذا كانت هذه هي مشكلتك.

على سبيل المثال:

public void contentsChanged(final ListDataEvent evt)
{
    if (!EventQueue.isDispatchThread())
    {
        log.debug("Delegating contentsChanged(...) to EDT");

        EventQueue.invokeLater(new Runnable() 
        {
            public void run() 
            {
                contentsChanged(evt);
            }
        });
        // don't run ensureIndexIsVisible twice:
        return;
     }

     if (playbackInProgress)
     {
         int index = evt.getIndex0();
         currentContentList.ensureIndexIsVisible(index);
     }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top