Kevin
Kevin

Reputation: 13

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);
}    

}

Upvotes: 1

Views: 394

Answers (2)

Lightsout
Lightsout

Reputation: 3757

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);
        }
    }

}

Upvotes: 0

MadProgrammer
MadProgrammer

Reputation: 347184

Start by taking a look at Painting in AWT and Swing and Performing Custom Painting

In order to be able to perform custom painting in Swing, you must...

  1. Inherit from a swing based component (like JComponent or JPanel)
  2. You must then override it's paintComponent method and perform you custom painting within this method.
  3. Add this component to something that is displayable (like a JFrame)

You should make sure to call super.paintComponent before doing any custom painting

To ensure that you're not making any (common) mistakes, you should use the @Override annotation

As an example...

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test2 extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawOval(70, 70, 100, 100);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(200, 200);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame();
                frame.setTitle("Images should be in this program");
                frame.add(new Test2());
                frame.pack();
                frame.setVisible(true);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            }
        });
    }

}

Upvotes: 1

Related Questions