Java图形绘制带有特定参数的圆

use*_*944 1 java graphics swing paintcomponent

对于问题,我必须在屏幕上绘制一个圆,其中心为(280,300),半径为50。提示说:圆是具有相同宽度和高度的椭圆形。该圆的中心在此椭圆的NW角以下50像素,在其NW角右侧50像素。

有TryoutPanel类:

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

我必须在下面填写代码:

public void paintComponent(Graphics g){
  super.paintComponent(g);
  setForeground(myColor);
  //INSERT CODE HERE
Run Code Online (Sandbox Code Playgroud)

我试过了: g.drawOval(280,300,50,50);

但是它说我使用了不正确的参数。我究竟做错了什么。

Mad*_*mer 5

x/ y参数drawOval是绘制椭圆的上/左角

为了能够在周围围绕中心点绘制圆230x300,您需要从每个点减去半径,然后生成宽度和高度(直径)的两倍,...

g.drawOval(230 - radius, 300 - radius, radius * 2, radius * 2);
Run Code Online (Sandbox Code Playgroud)

因此,此示例基本在的点周围绘制了一个矩形230x300,宽度/高度为200(半径= 100),并绘制了穿过该点的线以说明椭圆然后围绕其绘制的中心点...

椭圆

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

        }
    }

}
Run Code Online (Sandbox Code Playgroud)

哦,这setForeground(myColor);是任何paint方法中的一个可怕的坏主意,因为它将导致paint每次调用该方法时将一个事件添加到事件队列中,这将导致永无休止的重画请求,最终将消耗您的CPU