1
votes

For a problem I have to draw a circle on the screen with center at coordinates (280,300) with a radius of 50. The hint says: A circle is an oval with the same width and height. The center of this circle is 50 pixels below and 50 pixels to the right of the NW corner of this oval.

There is the TryoutPanel class:

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

public class TryoutPanel extends JPanel{

  private Color myColor;

  public TryoutPanel(Color c){
    myColor = c;
  }

  public void paintComponent(Graphics g){
    super.paintComponent(g);
    setForeground(myColor);
    g.drawString("top",10,50);
    g.drawLine(10,60, 200,60);
    g.drawString("middle",10,80);
    g.drawLine(10,90, 200,90);
    g.drawString("bottom",10,110);
    g.drawLine(10,120, 200,120);
    g.drawRect(200,300,100,50);
    g.drawOval(200,300,100,50);
    for(int j = 0; j < 9; j++)
      g.drawOval(50,200, 10 + 20*j, 210 - 20*j);
  }
}

I have to fill in the code in the following:

public void paintComponent(Graphics g){
  super.paintComponent(g);
  setForeground(myColor);
  //INSERT CODE HERE

I tried: g.drawOval(280,300,50,50);

But it says I used incorrect parameters. What am I doing wrong.

1
If the radius is 50, then the diameter is 100--this is part of your mistake.Jared
I tried g.DrawOval(280,300,100,100); and it still didn't workuser3312944
Yeah because then your center would be at (330, 350).Jared

1 Answers

5
votes

The x/y parameter of drawOval is the top/left corner from where the oval will be drawn

In order to be able to draw the circle around the center point if 230x300, you will need to subtract the radius from each point and then generate a width and height (diameter) of double that...

g.drawOval(230 - radius, 300 - radius, radius * 2, radius * 2);

So, this example basic draws a rectangle around the point of 230x300 with a width/height of 200 (radius = 100) and draws lines through this point to illustrate the center point the oval then drawn about...

Oval

import java.awt.BorderLayout;
import java.awt.Color;
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 TryoutOval {

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

    public TryoutOval() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TryoutPanel(Color.RED));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TryoutPanel extends JPanel {

        private Color myColor;

        public TryoutPanel(Color c) {
            myColor = c;
        }

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

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

            int centerX = 280;
            int centerY = 300;

            int radius = 50;
            int diameter = radius * 2;

            int x = centerX - radius;
            int y = centerY - radius;

            g.setColor(Color.BLACK);
            g.drawRect(x, y, diameter, diameter);
            g.drawLine(x, y, x + diameter, y + diameter);
            g.drawLine(x + diameter, y, x, y + diameter);

            g.setColor(myColor);
            g.drawOval(x, y, diameter, diameter);

            g.fillOval(centerX - 5, centerY - 5, 10, 10);

        }
    }

}

Oh, and setForeground(myColor); is a horribly bad idea within any paint method as it will cause a paint event to be added to the event queue each time the method is called, which will cause a never ending repaint request which will eventually consume your CPU