Question

J'ai un problème que je n'arrive pas à résoudre avec une petite animation. Pour un projet, nous concevons une application J9 à exécuter sur un PDA (DELL Axim X51). Le code qui pose problème (illustré ci-dessous) est lorsqu'un clic de souris est détecté pour exécuter une petite animation dans un panneau imbriqué. Si l'animation est exécutée indépendamment du clic de la souris, cela fonctionne bien et se repeint parfaitement. Lorsque la méthode est appelée lorsqu'un clic de souris est reconnu, le repeindre à chaque intervalle d'animation est ignoré et le panneau est repeint une fois l'animation terminée.

Je pense que lorsqu'un clic de souris est reconnu, l'application est synchronisée avec elle-même et arrête tous les appels de méthode internes à peindre OU que l'opération de peinture n'a pas une priorité suffisante. le clic de la souris.

Mon code:

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);
        }

}
Était-ce utile?

La solution

Dans StatusLoader.start , vous utilisez Thread.run au lieu de Thread.start . Cela signifie que StatusLoader.run est exécuté sur le thread des événements, ce qui est une très mauvaise chose. Changez-le en t.start () .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top