Проблема прямо здесь ...
g.fillOval(this.getX() + this.getWidth()/4 , this.getY() + this.getHeight()/4, this.getWidth()/2, this.getHeight()/2);
Контекст Graphics
, переданный вашему методу paintComponent
, уже переведен позицией компонентов x
/ y
, что означает, чтоверхний / левый угол компонента всегда 0x0
g.fillOval(this.getWidth()/4 , this.getHeight()/4, this.getWidth()/2, this.getHeight()/2);
, вероятно, будет работать лучше
Кроме того, вызов this.setBackground(Color.WHITE);
внутри paintComponent
нежелателен, так как он настроитСитуация, когда по новому циклу рисования будет запланировано, снова и снова.Не изменяйте состояние пользовательского интерфейса из метода рисования