从Java的文档中可以看出,Component的重绘机制已经过优化和缓存,所以即使它被调用了很多次,它也不会阻塞绘图管道。
看起来虽然在非常繁重的调用下,有时它无法绘制最新的帧。请考虑以下示例:
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
public class TestRepaint extends JPanel {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setContentPane(new TestRepaint());
frame.setSize(300, 100);
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private long start;
{
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
start = System.currentTimeMillis();
System.out.println("Repaint");
repaint();
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
long now = System.currentTimeMillis();
int where = (int) ((now - start) / 5);
if (where >= 200)
g.drawString("DONE", 200, 30);
else {
g.drawString("Working...", where, 30);
repaint();
}
}
}
当鼠标点击窗口时,然后是“工作......”#34;文本将向右滚动。在最后一帧,它应该变成" DONE"。似乎(随机)它无法绘制最后一帧和前一帧"工作......"文字依旧。例如,如果我们强制重绘显示(即改变窗口大小),那么" DONE"出现。
似乎,由于请求重绘速度太快,因此组件的最后一次重绘失败。那么,有没有保证的方法呢?