Search code examples
javaswingpaintcomponent

Java: paintComponent() Oval is not appearing in Netbeans


I'm trying to learn how to draw an oval in java but the paintComponent I made is not being called by anything, and attempting to call it only causes more issues.

The program runs successfully but the image I want displayed isn't showing up.

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


public class TEST2{
public void paintComponent(Graphics g){
    g.drawOval(70, 70, 100, 100);
}
public static void main(String[] args) {
    TEST2 gui = new TEST2();
    gui.setUpFrame();
}   
public void setUpFrame(){
    JFrame frame = new JFrame();
    frame.setTitle("Images should be in this program");
    frame.setSize(600,300);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}    

}

Solution

  • The paintComponent() method is a method that you override and it should be accessed inside a class that extends JPanel. You can create a new class that extends JPanel and override the paintComponent() method to draw your oval. You will also have to add the new JPanel to your JFrame for it to display. I modified your code below it should display the oval now. As Madprogrammer noted you should probably construct your GUI within the context of the edt to avoid concurrency issues but I will omit that for simplicity.

    import java.awt.*;
    import javax.swing.*;
    
    public class Test {
    
        public static void main(String[] args) {
            Test gui = new Test();
            gui.setUpFrame();
        }
    
        public void setUpFrame() {
            JFrame frame = new JFrame();
            frame.setTitle("Images should be in this program");
            frame.setSize(600, 300);
            JPanel oval = new oval();
            frame.setContentPane(oval);
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        public class oval extends JPanel{
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawOval(70, 70, 100, 100);
            }
        }
    
    }