有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为绘制添加计时器

我的程序当前从一个文本文件读取数据,并根据数组中的下一个值绘制不同颜色的圆圈。目前我正在读取数组中的前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));
            }
        }

    }

共 (1) 个答案

  1. # 1 楼答案

    在绘画方法中设置计时器或睡眠不是一个好主意。这将阻塞整个应用程序并混淆用户

    您可以使用在另一个线程中一步一步构建的屏幕外图像,并简单地在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方法中,您可以在图像img上绘制到i的圆。在此之后,对invalidaterepaint的调用导致paintComponent被调用。在这里,您只需使用drawImageimg的内容放在屏幕上