0

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

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));
            }
        }

    }
4

1 回答 1

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被调用。在那里,您只需drawImage将 的内容img放在屏幕上

于 2013-02-19T10:48:36.113 回答