Не видно JComponent на JPanel - Java

Узнай цену своей работы

Формулировка задачи:

Как -то пропустил тему по изучению Swing. Ради эксперимента решил написать простенькие часы. Осталось только графику сделать. Столкнулся со следующей проблемой: создаю JPanel, на который буду помещать циферблат и стрелки (наследники JComponent). Добавляю панель во фрейм и компонентов не видно. Если добавить компоненты просто на фрейм, то все видно. Пробовал разными способами и пока не могу понять в чем причина того, что компоненты не видно на панели во фрейме. P.S. куски кода для примера. Если кто-то скажет, что тут много доделать надо.
package clock;
 
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Point2D;
 
public class ClockFace extends JComponent {
    
    private Point2D center;
    private double radius;
    private boolean hasMinutesLabels;
    
    public ClockFace(Point2D center, double radius) {
        super();
        this.center = center;
        this.radius = radius;
        hasMinutesLabels = false;
    }
    
    public ClockFace(Point2D center, double radius, boolean hasMinutesLabels) {
        super();
        this.center = center;
        this.radius = radius;
        this.hasMinutesLabels = hasMinutesLabels;
    }
    
    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        g2.setStroke(new BasicStroke(2.0f));
        Ellipse2D ellipse = new Ellipse2D.Double(center.getX()-radius, center.getY()-radius,
                center.getX()+radius, center.getY()+radius);
        g2.draw(ellipse);
    }
}
package clock;
 
import com.sun.org.apache.regexp.internal.RE;
 
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Point2D;
 
public class ClockPanel extends JPanel {
    //TODO: панель содержит все элементы часов и слушает изменение времени
    
    public ClockPanel() {
        setPreferredSize(new Dimension(300,300));
//        Point2D center = new Point2D.Double(getPreferredSize().width/2, getPreferredSize().height/2);
        ClockFace clockFace=new ClockFace(new Point2D.Double(20,20), 20);
        add(clockFace, BorderLayout.CENTER);
    }
    
}
package clock;
 
import javafx.embed.swing.JFXPanel;
 
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Point2D;
 
public class ClockFrame extends JFrame {
    
    private final int DEFAULT_WIDTH = 300;
    private final int DEFAULT_HEIGHT = 300;
    
    public ClockFrame() throws HeadlessException {
        super("Clock");
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        
        add(new ClockPanel()); //так не работает
        add(new ClockFace(new Point2D.Double(20, 20), 20));//так работает
    }
}
package clock;
 
import javax.swing.*;
import java.awt.*;
 
public class Test {
    
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame clockFrame = new ClockFrame();
                clockFrame.setVisible(true);
            }
        });
    }
}

Решение задачи: «Не видно JComponent на JPanel»

textual
Листинг программы
package clock;
 
import javax.swing.*;
import java.awt.*;
 
public class Test {
    
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                Clock clock=new Clock();
                JFrame clockFrame = new ClockFrame();
                clockFrame.setVisible(true);
                clock.run();
            }
        });
    }
}

Оцени полезность:

9   голосов , оценка 4 из 5