2

fillRect()class の複数のメソッドを使用した Animated ProgressBar を作成していjavax.swing.Graphicsます。
各長方形が描画された後に遅延を置くために、遅延Thread.sleep(500)を作成する方法を使用しています (遅延を作成するために、多くのフォーラムで提案されています)。
問題は、各 Rectangle ボックスが表示された後に 0.5 秒の遅延を発生させるのではなく、最初にすべての四角形に必要な遅延全体を取り、最終的な画像、つまりプログレス バーを表示することです。
質問 1すべてのバーを遅延させるには、遅延 " " をバー " "と一緒に
1 つのバーに入れます。質問2Thread.sleep(500)fillRect()for() loop

各長方形バーで遅延が同時に発生するようにコードを変更するにはどうすればよいですか。プログラムを実行すると、アニメーション プログレス バーが生成されます。
コード:

import javax.swing.JOptionPane;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;

class DrawPanel extends JPanel
{
    public paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.setColor(new Color(71,12,3));
        g.fillRect(35,30,410,90);

        for ( int i=1; i<=40; i+=2)
        {
          Color c = new Color (12*i/2,8*i/2,2*i/2);
          g.setColor(c);
          g.fillRect( 30+10*i,35,20,80);

        try
          { Thread.sleep(500); } 
        catch(InterruptedException ex)
          { Thread.currentThread().interrupt(); }
        }
    }
}

class ProgressBar
{
    public static void main (String []args)
    {
        DrawPanel panel = new DrawPanel();
        JFrame app = new JFrame();
        app.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        app.add(panel);
        app.setSize(500,200);
        app.setVisible(true);
    }
}  

ご協力ありがとうございます。

4

2 に答える 2

6

EDT (Event Dispatch Thread) をブロックしないでください。ブロックすると、GUI が「フリーズ」します。呼び出す代わりに、繰り返されるタスクThread.sleep(n)の Swing を実装します。Timer詳細については、Swingでの同時実行を参照してください。また、@Brian によってリンクされたプログレス バーのチュートリアルも必ず確認してください。実用的な例が含まれています。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class DrawPanel extends JPanel
{
    int i = 0;
    public DrawPanel() {
        ActionListener animate = new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                repaint();
            }
        };
        Timer timer = new Timer(50,animate);
        timer.start();
    }
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.setColor(new Color(71,12,3));
        g.fillRect(35,30,410,90);

        Color c = new Color (12*i/2,8*i/2,2*i/2);
        g.setColor(c);
        g.fillRect( 30+10*i,35,20,80);

        i+=2;
        if (i>40) i = 0;
    }
}

class ProgressBar
{
    public static void main (String []args)
    {
        DrawPanel panel = new DrawPanel();
        JFrame app = new JFrame();
        app.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        app.add(panel);
        app.setSize(500,200);
        app.setVisible(true);
    }
}
于 2012-11-16T10:32:26.987 に答える
1

私は本当にこれをしません。Swing の更新スレッドは、このように使用することは想定されていません。別のスレッド (おそらくTimerTaskを使用) を使用し、必要に応じて四角形を再描画する方がはるかに優れています。

詳細やコードなどについては、Oracle ProgressBar のチュートリアルをご覧ください。

于 2012-11-16T09:58:13.633 に答える