Warum ist repaint mein Gremium nicht genannt zu werden?
-
03-07-2019 - |
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);
}
}
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()
.