请求过快时,Swing Component(重新)绘制机制无法正确绘制

时间:2015-11-01 16:50:08

标签: java swing paint paintcomponent repaint

从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"出现。

似乎,由于请求重绘速度太快,因此组件的最后一次重绘失败。那么,有没有保证的方法呢?

0 个答案:

没有答案