سؤال

أنا أكتب لعبة باستخدام جافا سوينغ. أريد أن أرسم في كل مرة يتم تنفيذ حلقة مع تأخير صغير بينهما لإنشاء تأثير تتالي على الشاشة. أعتقد أن إجراءات الكفاءة في النظام تنهار المكالمات repaint() في مكالمة واحدة. على أي حال ، تحدث جميع التغييرات مرة واحدة بعد التأخير الكلي. هل هناك طريقة ما لإجبار النظام على إعادة النشر على الفور ثم تأخير كل تكرار للحلقة؟

رمز بلدي:

for(int i=0;i<10;i++){
    JButton[i].setBackground(Color.WHITE);
    JButton[i].repaint();
    Thread.sleep(2000);
    JButton[i].setBackground(Color.GRAY);
    JButton[i].repaint();
}
هل كانت مفيدة؟

المحلول

يمكنك استخدام JComponent.paintImmediately لفرض إعادة طلاء فوري.

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

void uiFunction() {
    new Thread() {
        public void run() {
            for(int i = 0; i < 10; i++) {
                final JButton b = buttons[i];
                SwingUtilities.invokeLater(new Runnable() {
                    b.setBackground(Color.WHITE);
                    b.repaint();
                }
                Thread.sleep(2000);
                SwingUtilities.invokeLater(new Runnable() {
                    b.setBackground(Color.GRAY);
                    b.repaint();
                }
            }
        }
    }.run();
}

إنه أمر محدود بعض الشيء ولكن نأمل أن يمنحك فكرة عن مكان البدء.

نصائح أخرى

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

بناءً على هذا الفكر ، أعتقد أنه قد يكون لديك خياران:

  1. ضع الكود على سلسلة رسائل ثانية بحيث لا يوقف مؤشر ترابط الرسومات الرئيسي وأيضًا لأنه يعني أن خيط الرسومات Cando A REPAINT على جانب النوم الذي يحدث.

  2. قبل أن تنام (لا ينصح حقًا ، سأفكر) ، قم بإطلاق حلقة الحدث لإجبار إعادة النشر على الحدوث. يجب أن أبحث عن هذا. لا أستطيع تذكر كيفية القيام بذلك من أعلى رأسي. :-)

من المحتمل أن أنظر إلى المرتبة الأولى كأفضل خيار.

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