I want to be able to draw over this image with graphics paintComponent.
1) Never do I/O in a painting method. A painting method should be efficient and only do painting.
2) Never create a component add attempt to add it to the panel in a painting method. Every time the painting method is called you end up creating a new component and adding it to the panel.
If you want to paint on top of an image, then you:
1. get rid of the JLabel.
2. read the image in the constructor of your class
3. use the drawImage(....) method to paint the image in the paintComponent(...) method
4. then do your drawOval(...). Since the drawOval is done after the drawImage, the oval will appear on top of the image.
You also need to override the getPreferredSize() method of the PaintingCanvas class so layout managers know what size your canvas should be.