O JComponent para de ser renderizado assim que sai da tela

Estou tentando fazer uma animação simples na qual um retângulo começa na tela (no lado direito da borda direita da tela) e se move para a esquerda. Portanto, neste caso, meu quadro tem uma largura de 1000 e a parede começa com um valor x de 1100. Obviamente, a princípio, o retângulo não deveria estar visível para nós. Mas, à medida que o retângulo se move para a esquerda, ele deve se tornar visível. No entanto, esta animação não faz isso. Mesmo quando o valor x da parede está dentro dos limites da tela, ele não está sendo renderizado.

Eu tentei colocar umprintln() declaração nopaintComponent() método da parede, e eu descobri que opaintComponent() não estava sendo chamado pelo quadrorepaint() método. Imaginei que, quando a parede foi adicionada pela primeira vez ao quadro, o Swing decidiu que, como estava fora da tela, não precisava ser renderizado; portanto, mesmo quando a parede entra na tela, o Swing acha que não precisa para ser renderizado.

Tentei revalidar e invalidar o quadro e o componente, mas nada funcionou. Por favor me ajude a consertar isso. Abaixo está o código:

package graphics.simpleAnimation;

public class Simple_Animation implements Runnable {

    private UI ui; // The UI (frame)

    private Wall wall; // Wall object that moves across the screen

    private Simple_Animation() {

        // Initialize the wall object (intentionally given an x value that is greater than the frame's width)
        wall = new Wall(1100, 400, 200, 400);

        // Initialize the UI (width is only 1000)
        ui = new UI(1000, 600, "Geometry Dash");

        // Add the wall to the ui (the frame)
        ui.add(wall);

    }

    public void run() {
        // Set the frame visible
        ui.setVisible(true);

        // Repaint the frame and move the wall
        while (true) {
            ui.repaint();
            wall.moveWall(-2, 0);

            try {
                Thread.sleep(16);
            } catch (InterruptedException IE) {
                System.out.println(IE);
            }

        }

    }

    // Starts the program in a new thread
    public static void main(String[] args) {
        Simple_Animation simpleAnimation = new Simple_Animation();
        new Thread(simpleAnimation).start();
    }

}


package graphics.simpleAnimation;

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

public class UI extends JFrame {

    // Variables storing the width and height of the content pane (where the components are being rendered)
    public int content_pane_width;
    public int content_pane_height;

    public UI(int frameW, int frameH, String frameTitle) {

        setTitle(frameTitle);
        setSize(frameW, frameH);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setLayout(null);

        content_pane_width = getContentPane().getWidth();
        content_pane_height = getContentPane().getHeight();

    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
    }

}

package graphics.simpleAnimation;

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

public class Wall extends JComponent {

    private int wallX;
    private int wallY;
    private int wallW;
    private int wallH;


    Wall(int x, int y, int sizeX, int sizeY) {
        wallX = x;
        wallY = y;
        wallW = sizeX;
        wallH = sizeY;

        setSize(getPreferredSize());
    }

    public void moveWall(int moveX, int moveY) {
        wallX += moveX;
        wallY += moveY;
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(wallW, wallH);
    }

    @Override
    public void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;

        setLocation(wallX, wallY);
        g2d.fillRect(0, 0, wallW, wallH);
    }
}

questionAnswers(2)

yourAnswerToTheQuestion