添加计时器以进行绘制

时间:2013-02-19 10:29:20

标签: java paintcomponent

我的程序当前从文本文件中读取并根据数组中的下一个值绘制不同颜色的圆圈。目前我正在读取数组中的前10个值,因此应该有10个画圆圈。这些圆圈全部同时绘制,但我希望它们逐个绘制,例如每个绘制圆圈之间的间隔为2秒。下面的代码是读取值和绘制圆圈的部分。有人可以帮帮我吗。我很困惑在哪里以及如何添加计时器。

public void paintComponent(Graphics g) {
        drawShapes(g, circlesT);
    }

    public void drawShapes(Graphics g, ArrayList<Shape> circlesT) {
        Graphics2D ga = (Graphics2D) g;
        ga.drawImage(newImage, 0, 0, null);



        for (int i = 0; i < circlesT.size(); i++) {
            ga.draw(circlesT.get(i));
            ga.setPaint(Color.white);
            ga.fill(circlesT.get(i));
        }


        for (int i = 0; i < 10; i++) {


            if (read.temp.get(i) < 31 && read.temp.get(i) > 30) {
                ga.draw(circlesT.get(i));
                ga.setPaint(Color.green);
                ga.fill(circlesT.get(i));
            } else if (read.temp.get(i) < 32 && read.temp.get(i) > 31) {
                ga.draw(circlesT.get(i));
                ga.setPaint(Color.red);
                ga.fill(circlesT.get(i));
            } else if (read.temp.get(i) < 33 && read.temp.get(i) > 32) {
                ga.draw(circlesT.get(i));
                ga.setPaint(Color.yellow);
                ga.fill(circlesT.get(i));
            }
        }

    }

1 个答案:

答案 0 :(得分:0)

在绘画方法中使用计时器或睡眠不是一个好主意。这将阻止整个应用程序并使用户感到困惑。

您可以使用在另一个线程中逐步构建的屏幕外图像,并在paint方法中显示该图像。

代码的总体布局可能如下:

BufferedImage img = new BufferedImage(...);
ActionListener taskPerformer = new ActionListener() {
    int currentIteration = 0;
    public void actionPerformed(ActionEvent evt) {
        drawShapes(currentIteration++);
        invalidate();
        repaint();
        if (currentIteration >= maxIterations) {
            timer.stop();
        }
    }
}
timer = new Timer(2000, taskPerformer);
timer.start();

drawShapes方法中,您可以将圆圈绘制到i到图像img上。之后,对invalidaterepaint的调用会导致paintComponent被调用。在那里,您只需使用drawImageimg的内容放在屏幕上