Search code examples
javaswingjpanelpaintcomponentthread-sleep

Pause before painting the panel in Java


I am trying to slow down the painting by adding a pause between two consecutive paints. Thread.sleep() apparently doesn't work. Here is the code:

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

public class Sa {
    int x = 70;
    int y = 70;

    public static void main(String[] args) {
        Sa gui = new Sa();
        gui.go();
    }

    public void go() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        MyDrawPanel drawPanel = new MyDrawPanel();
        frame.getContentPane().add(drawPanel);

        frame.setSize(300, 300);
        frame.setVisible(true);

        for(int i=0; i<130; i++) {
            x++;
            y++;
            drawPanel.repaint();
            try {
                Thread.sleep(1500);
            } catch(Exception ex) {}
        }

    }

    class MyDrawPanel extends JPanel {
        public void paintComponent(Graphics g) {
            g.setColor(Color.white);
            g.fillRect(0, 0, this.getWidth(), this.getHeight());
            Thread.sleep(1500); // will not work!!
            g.setColor(Color.green);
            g.fillOval(x, y, 80, 40);
        }
    }
}

Solution

  • Remove Thread.sleep() inside paint() method, not need it, and second, you Thread.sleep() needs to be caught InterruptedException, it may give an error while compiling:

      g.setColor(Color.white);
        g.fillRect(0, 0, this.getWidth(), this.getHeight());
        //Thread.sleep(1500); // will not work!! (DONT NEED this
        g.setColor(Color.green);
        g.fillOval(x, y, 80, 40);
    

    Have you looked at Swing Timer ?