لماذا إعادة رسم بلدي الفريق لا يطلق؟
-
03-07-2019 - |
سؤال
ولقد حصلت مشكلة التي أنا فقط لا يمكن أن يبدو للالتفاف تنطوي على الرسوم المتحركة الصغيرة. لمشروع نحن تصميم تطبيق 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()
.