سؤال

ولقد حصلت مشكلة التي أنا فقط لا يمكن أن يبدو للالتفاف تنطوي على الرسوم المتحركة الصغيرة. لمشروع نحن تصميم تطبيق J9 لتعمل على جهاز PDA (DELL اكسيم X51). رمز إشكالية (كما هو موضح أدناه) هو عندما تم الكشف عن زر الماوس لتشغيل الرسوم المتحركة صغيرة في لوحة متداخلة. إذا تم تشغيل الرسوم المتحركة بشكل مستقل عن زر الماوس، أنه يعمل بشكل جيد ويعيد طلاء تماما. عندما يتم استدعاء الأسلوب عندما يتم الاعتراف بنقرة ماوس وإعادة رسم في كل الرسوم المتحركة الفاصلة لنا تجاهل وفقط بمجرد الانتهاء من الرسوم المتحركة سيتم طلاؤها لوحة.

أنا <م> التفكير قد يكون لها علاقة ما مع عندما يتم الاعتراف النقر بالماوس تتم مزامنة التطبيق مع نفسه وقف يدعو أي أسلوب داخلي لرسم أو أن عملية الطلاء ليس لديها أولوية عالية بما فيه الكفاية على على زر الماوس.

قانون بلدي:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class StatusLoader extends Panel implements Runnable{

        int progress;

        public static void main(String[] args) {
                Frame f = new Frame();
                StatusLoader  mp = new StatusLoader();
                mp.setBackground(Color.yellow);
                f.add(mp);

                f.setSize(300,300);
                f.show();       
                f.addWindowListener(new WindowAdapter() {            
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
                mp.start();
        }

        public void start(){
                Thread t = new Thread(this);
                t.run();

        }

        public void run(){
                for (int i = 0; i < 10; i++) {
                        progress+=10;
                        this.repaint(0);
                        System.out.println(i);
                        try{
                                Thread.sleep(100);
                        }catch(InterruptedException ex){}
                }
        }

        public void paint(Graphics g){
                System.out.println("called repaint");
                g.setColor(Color.red);
                g.setFont(new Font("Sansserif",2,24));
                FontMetrics fm = g.getFontMetrics();
                int stringWidth = fm.stringWidth("Loading");
                g.drawString("Loading", getWidth()/2-stringWidth/2, getHeight()/2);
                g.setFont(new Font("Sansserif",2,12));
                fm = g.getFontMetrics();
                stringWidth = fm.stringWidth("Map ziles for the new zoom level");
                g.drawString("Map tiles for the new zoom level", getWidth()/2-stringWidth/2, getHeight()/2+30);
                g.drawRect(getWidth()/2-100, getHeight()/2+60, 200, 10);
                g.setColor(Color.blue);
                g.fillRect(getWidth()/2-100, getHeight()/2+60, progress*2, 10);
        }

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

المحلول

في StatusLoader.start، يمكنك استخدام Thread.run بدلا من Thread.start. وهذا يعني أن يتم تنفيذ StatusLoader.run على موضوع الأحداث، وهو أمر سيء جدا. تغييره إلى t.start().

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