Почему перерисовка моей панели не вызывается?

StackOverflow https://stackoverflow.com/questions/619675

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть проблема, которую я просто не могу обойти, включив небольшую анимацию. Для проекта мы разрабатываем приложение J9 для запуска на КПК (DELL Axim 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