Java – Unable to draw circles, although a logical way was used

Unable to draw circles, although a logical way was used… here is a solution to the problem.

Unable to draw circles, although a logical way was used

I

tried drawing a circle using java awt and all I got in the output were a couple of small ones that were far apart and didn’t look like a circle overall. The code is as follows:

class DrawFrame extends JFrame {
    int хс, yc, r, x, y;
    float p;
    DrawFrame(int rr, int c1, int c2) {
        setSize(1000, 1000);
        setTitle("circle drawing algo");
        r = rr;
        xc = c1;
        yc = c2;
    }
    public void paint(Graphics g) {
        Circl(g);
    }
    public void Circl(Graphics g) {
        x = xc - r;
        while (x <= (xc + r)) {
            for (y = yc - r; y <= (yc + r); y++) {
                p = x * x + y * y - r * r;
                if (p == 0.0)
                    g.drawOval(x, y, 2, 2);
            }
            x++;
        }
    }

Solution

You should first read Performing Custom Painting and Painting in AWT and Swing better understand how the painting system works and how you should use it.

You should not override the paint methods of top-level components, which are actually composite components except that they are not double-buffered. This means that there are many extra components on them that provide the overall functionality of the window.

JRootPane and it's many layers

This means that what you draw to the surface of the frame may be ignored because the content at the top of the frame overrides it.

You also ignore the complexity of the painting process, and you should always call its super method unless you are prepared to take over the responsibility of the paint method yourself.

A better place to start is to use JPanel (simpler) and override its paintComponent method

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 Main {

public static void main(String[] args) {
        new Main();
    }

public Main() {
        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("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane(100, 100, 100));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

public class TestPane extends JPanel {

int xc, yc, r;

public TestPane(int rr, int c1, int c2) {
            r = rr;
            xc = c1;
            yc = c2;
        }

@Override
        public Dimension getPreferredSize() {
            return new Dimension(r * 2, r * 2);
        }

@Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            circle(g);
        }

public void circle(Graphics g) {
             Credit to LAD for the algorithm updates
            int x = xc - r;
            while (x <= (xc + r)) {
                for (int y = yc - r; y <= (yc + r); y++) {
                    float p = (x - xc) * (x - xc) + (y - yc) * (y - yc) - (r * r);
                    if (p <= 0.0f)
                    {
                        g.drawOval(x, y, 2, 2);
                    }
                }
                x++;
            }

}
    }

}

The algorithm update is credited to LAD

Related Problems and Solutions