문제

작은 애니메이션과 관련하여 돌아 다닐 수없는 문제가 있습니다. 프로젝트의 경우 PDA (Dell Axim X51)에서 실행될 J9 응용 프로그램을 설계하고 있습니다. 문제가있는 코드 (아래 표시)는 마우스 클릭이 중첩 된 패널에서 작은 애니메이션을 실행하도록 감지 된 경우입니다. 애니메이션이 마우스 클릭과 독립적으로 실행되면 잘 작동하고 완벽하게 다시 인쇄됩니다. 마우스 클릭이 모든 애니메이션 간격에서 리 페인트를 인식 할 때 메소드가 호출되면 우리를 무시하고 애니메이션이 완료되면 패널이 다시 페인트됩니다.

생각한다 마우스 클릭이 인식되면 응용 프로그램 자체가 페인트를 페인트하기 위해 내부 메소드 호출을 중지하거나 페인트 작동이 마우스 클릭에 비해 우선 순위가 충분하지 않다는 것을 인식 할 때 관련이있을 수 있습니다.

내 코드 :

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