سؤال

أحتاج إلى طريقة للانتظار حتى يتم طلاء JComponent (Swing) بالكامل.تنشأ هذه المشكلة الفعلية من تطبيق openmap:وتتمثل المهمة في رسم خريطة (mapBean) بطبقتين وإنشاء صورة من تلك الخريطة.

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

على الرغم من أنه تم توضيحها باستخدام تطبيق openmap هذا، إلا أن المشكلة عامة تمامًا ومن المفترض أنها مرتبطة بـ Swing.في الوقت الحالي، أنتظر وقتًا محددًا (ثانية واحدة) ولكن هذا لا يلغي خطر إنشاء خرائط غير مكتملة...

يحرر

بعض التفاصيل الإضافية - يجب أن أبدأ بإنشاء MapPanel (OpenMap)، حيث يقوم Internallz بإنشاء MapBean (فئة فرعية JComponent) وMapHandler.ثم أقوم بتغذية MapHandler بالطبقات الجغرافية ويبدأ الإطار في رسم البيانات الجغرافية "على" نوع JComponent MapBean.

بعد إضافة جميع الطبقات إلى الخريطة، أستخدم فئة إطار عمل أخرى لإنشاء صورة JPG (أو:البايت [] الذي يحمل بيانات الصورة).و هذا يمكن أن يسبب مشكلة، إذا لم أنتظر:يقوم "منشئ الصور" هذا بإنشاء الصورة من الحالة الحالية لحبة الخريطة، وإذا قمت بتسمية "منشئ الصور" هذا في وقت مبكر، فإن بعض طبقات الخريطة لا يتم رسمها أو فقدانها.مزعج جدا...

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

المحلول

java.awt.EventQueue.invokeLater سيسمح لك بتشغيل مهمة بعد انتهاء عملية الطلاء.إذا كان يقوم بنوع من التحميل غير المتزامن، فسيكون خاصًا بواجهة برمجة التطبيقات (مثل MediaTracker يفعل ل Image).

نصائح أخرى

يمكنك أيضًا تجربة استخدام مخزن مؤقت خارج الشاشة لعرض صورتك في:

 MapBean map = new MapBean();
 map.setData(...);

 BufferedImage bi = new BufferedImage(...);
 map.paintComponent(bi.getGraphics());

 writeToFile(bi);

يبدو أنك بحاجة إلى مزامنة تحديث البيانات الأساسية لـ JComponent مع دورة طلاء Swing.يمكنك تصنيف JComponent الخاص بك وتزيينه paintComponent() الطريقة، يمكنك الاطلاع عليها أيضًا ImageObserver.imageUpdate(), ، على الرغم من أنني لست متأكدًا مما إذا كان هذا سيخبرك بما تريد.

public class DrawingCycleAwareComponent extends MyOtherJComponent {

    private final Object m_synchLock = new Object();

    protected void paintComponent(Graphics g) {
        synchronized (m_synchLock) {
            super.paintComponent(g);
        }
    }

    protected void updateData(Object data) {
        if (SwingUtilities.isEventDispatchThread()) {
            reallySetMyData(data);  // don't deadlock yourself if running in swing
        }
        else {
            synchronized (m_synchLock) {
                reallySetMyData(data);
            }
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top