Frage

ich habe ein Problem, das ich kann einfach nicht scheinen, um eine kleine Animation beteiligt ist. Für ein Projekt entwerfen wir eine J9-Anwendung auf einem PDA (Dell Axim X51) laufen. Der problematische Code (siehe unten) ist, wenn ein Mausklick erkannt wird eine kleine Animation in einer verschachtelten Panel auszuführen. Wenn die Animation unabhängig von dem Mausklick ausgeführt wird, funktioniert es gut und vollkommen neu zeichnet. Wenn die Methode aufgerufen wird, wenn ein Mausklick auf jedem Animations Intervall der Neuzeichnungsindex erkannt wird uns ignoriert und nur einmal die Animation abgeschlossen ist, wird die Platte neu gestrichen werden.

I denkt es könnte etwas mit dem zu tun hat, wenn ein Mausklick die Anwendung erkannt wird, synchronisiert mit mir selbst jedes internen Verfahren zu stoppen ruft zu malen oder dass die Farbe Betrieb muss nicht hoch genug Vorrang vor der per Mausklick.

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

}
War es hilfreich?

Lösung

In StatusLoader.start verwenden Sie Thread.run statt Thread.start. Das bedeutet StatusLoader.run auf dem Ereignis Thread ausgeführt wird, das eine sehr schlechte Sache ist. Ändern Sie ihn auf t.start().

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top