0

私のプログラムは現在、テキスト ファイルから読み取り、配列内の次の値に応じて異なる色の円を描画します。現時点では、配列の最初の 10 個の値を読み取っているため、10 個の塗りつぶされた円があるはずです。これらの円はすべて同時にペイントしますが、1つずつペイントしたいので、たとえば、ペイントされた各円の間に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));
            }
        }

    }
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円をペイントします。その後、呼び出しと原因が呼び出されます。そこで、コンテンツを画面に配置するだけですiimginvalidaterepaintpaintComponentdrawImageimg

于 2013-02-19T10:48:36.113 に答える