내 패널의 리 페인트가 호출되지 않은 이유는 무엇입니까?
-
03-07-2019 - |
문제
작은 애니메이션과 관련하여 돌아 다닐 수없는 문제가 있습니다. 프로젝트의 경우 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()
.
제휴하지 않습니다 StackOverflow