Search code examples
javaswingjframejpanelpaintcomponent

paintComponent() method not drawing to JPanel


The JFrame and JPanel show up, but the paintComponent method isn't drawing on the JPanel. I only see the JLabel, JTextField and JButton that I added but not what should be drawn on the JPanel.

update; question has been answered: The circles actually were being drawn to the JPanel but I got the coordinates wrong so they were being drawn outside of the frame.

JFrame class:

package h02;

import javax.swing.*;

public class Circles extends JFrame {

    public Circles() {

    // JFrame and its properties

    JFrame frame = new JFrame();

    frame.setSize(500,500);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocation(100, 100);
    frame.setTitle("Circles");
    frame.add(new CirclesPanel());
    frame.setVisible(true);

}

public static void main(String[] args) {

        new Circles();
    }

}

JPanel class:

    package h02;

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

    public class CirclesPanel extends JPanel implements ActionListener {

        // Fields

    private JTextField enterDiameter;
    private JButton drawButton;
    private int diameter;
    private final int Y = 470;

    // making the panel

    public CirclesPanel() {

        enterDiameter = new JTextField("100", 5);
        enterDiameter.addActionListener(this);
        drawButton = new JButton("Teken");
        drawButton.addActionListener(this);
        add(new JLabel("Diameter"));
        add(enterDiameter);
        add(drawButton);

    }

    // find the diameter

    public void findDiameter() {

        int diameterString = Integer.parseInt(enterDiameter.getText());
        diameter = diameterString;
    }

    // draw circles


    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        int centre = getWidth() / 2;
        g.drawLine(30, Y, Y , Y);
        g.setColor(Color.ORANGE);
        g.fillOval(centre, Y, diameter, diameter);
        g.setColor(Color.BLACK);
        g.drawOval(centre, Y, diameter, diameter);
        g.drawOval(centre, Y, diameter / 2, diameter);
    }

    // on action performed...

    public void actionPerformed(ActionEvent e) {
        findDiameter();
        repaint();
    }

}

Solution

  • The problem is with your "Y" in CirclesPanel. Elements are drawn but outside the frame, try reducing Y, than surely you'll see your elements.

    Alternatively increase the frame size.