Il metodo drawOval vuole come primi due parametri le coordinate del angolo in alto a sinistra del rettangolo contenente l'ovale e come successivi due parametri diametro orizzontale e verticale dell'ovale(in caso di cerhci i valori devono essere uguali).
Non salvare altezza e larghezza nel costruttore, ma utilizza due variabili locali nel metodo paintComponent, cosi' vengono calcolate ad ogni iterazione e il layout diventa liquido.
codice:
public class DisegnaCerchi extends JPanel {
    //Il padding e la distanza dal bordo del JPanel, la utilizzo quando disegno il cerchio.
    public static final int PADDING = 5;
    public DisegnaCerchi() {}

    public void paintComponent(Graphics abc) {
        super.paintComponent(abc);
        //calcolo le dimensioni come il minimo dei lati del pannello. 
        //Casto a int perche' i metodi restituiscono double.
        //nota non uso this.getHeight(), ma this.getSize().getHeight().
        int dimensioni = (int)(Math.min(this.getSize().getWidth, this.getSize().getHeight()));
        abc.drawOval(PADDING,PADDING,dimensioni-(PADDING*2),dimensioni-(PADDING*2));
    }
}