0

ホイール (6 つのセグメントを持つ円) と各セグメントを異なる色で描画するプログラムを作成しました。ホイールをアニメーション化します..

コードは次のとおりです。

    public class ExamWheel extends JFrame implements ActionListener{
        JButton b_start = new JButton("Start");
        JButton b_stop = new JButton("Stop");
        Thread th;
        Boolean doDraw = true;

        public ExamWheel(){
            setSize(400,400);
            setVisible(true);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setLocationRelativeTo(null);
            setTitle("Wheel..");
            //add(b_start);
            this.setLayout (new FlowLayout());
            this.add(b_stop);
            b_start.addActionListener(this);
        }

        public void actionPerformed(ActionEvent e) {
            if(e.getSource()==b_start)
                doDraw=true;
        }

        public void paint(Graphics graphics) {
        if (doDraw){
            super.paint(graphics);
            Graphics2D g = (Graphics2D) graphics;
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

            try{
            // draw the circle
            for(int i=0; ; i=i+1){
                g.setColor(Color.CYAN);
                g.fillArc(50, 50, 300, 300, i+0, 60);
                th.sleep(1);
                g.setColor(Color.red);
                g.fillArc(50, 50, 300, 300, i+60, 60);
                th.sleep(1);
                g.setColor(Color.green);
                g.fillArc(50, 50, 300, 300, i+120, 60);
                th.sleep(1);
                g.setColor(Color.blue);
                g.fillArc(50, 50, 300, 300, i+180, 60);
                th.sleep(1);
                g.setColor(Color.gray);
                g.fillArc(50, 50, 300, 300, i+240, 60);
                th.sleep(1);
                g.setColor(Color.pink);
                g.fillArc(50, 50, 300, 300, i+300, 60);
                th.sleep(1);
            }
            }
            catch(InterruptedException e){
                Thread.currentThread().interrupt();
            }
        }
        }

        public static void main(String[] args) {
            ExamWheel f = new ExamWheel();
        }

    }

問題:無限ループで、フレームを停止したり閉じたりすることができません。

だから私は考えていた:

値 true のブール変数 (doDraw) を作成し、JButton を追加します。ボタンをクリックすると、変数は false に変わります。paint() メソッドでは、paint() の最初に if 条件を使用します。

問題: paint() を使用して JButton を Frame に追加できません。どうすればよいですか?

注: paintComponent() を使用しようとしましたが、ループ (for with thread) が機能しません。

IT IS SOLVED ピート・カーハムに感謝

Timer を追加し、paint() を paintComponent() に置き換えました

public class ExamWheel extends JPanel implements ActionListener {
    int i=0;
    Timer tm = new Timer(10, this);
    public void paintComponent(Graphics graphics) {
        super.paintComponent(graphics);
        Graphics2D g = (Graphics2D) graphics;
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        g.setColor(Color.CYAN);
        g.fillArc(50, 50, 300, 300, i+0, 60);
        g.setColor(Color.red);
        g.fillArc(50, 50, 300, 300, i+60, 60);
        g.setColor(Color.green);
        g.fillArc(50, 50, 300, 300, i+120, 60);
        g.setColor(Color.blue);
        g.fillArc(50, 50, 300, 300, i+180, 60);
        g.setColor(Color.gray);
        g.fillArc(50, 50, 300, 300, i+240, 60);
        g.setColor(Color.pink);
        g.fillArc(50, 50, 300, 300, i+300, 60);
        tm.start();
    }
    public void actionPerformed(ActionEvent e) {
        i++;
        repaint();
    }
    public static void main(String[] args) {
        ExamWheel wh = new ExamWheel();
        JFrame jf = new JFrame();
        jf.setSize(500,500);
        jf.setResizable(false);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setLocationRelativeTo(null);
        jf.setTitle("Wheel..");
        jf.add(wh);
    }
4

1 に答える 1

1

GUI を実行するスレッドが、ボタン イベントに応答したり、実際にグラフィックの内容を画面に表示したりするなど、他のことを実行できるようにするには、paintComponent から戻る必要があります。

タイマーを使用してコンポーネントを無効にします - http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.htmlを参照し、現在の時間に基づいてアニメーションを更新します。 5 秒ごとに繰り返されるサイクル。

于 2012-11-23T20:45:36.637 に答える