2014-04-16 25 views
0

对于一个问题,我必须在屏幕上以半径为50的坐标(280,300)为中心绘制一个圆圈。提示说明:圆形是具有相同宽度和高度的椭圆形。该圆的中心在该椭圆的NW角的右下方50个像素和50个像素。具有特定参数的Java图形绘制圆

还有就是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); 
    } 
} 

我必须填写该代码如下所示:

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

我想: g.drawOval(280,300,50,50);

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

+0

如果半径为50,则直径为100--这是您错误的一部分。 – Jared

+0

我试过g.DrawOval(280,300,100,100);它仍然没有工作 – user3312944

+0

是的,因为那时你的中心会在(330,350)。 – Jared

回答

4

drawOvalx/y参数是从哪儿椭圆将提请

为了能够绘制围绕中心点圆顶部/左上角如果230x300,你需要减去从每个点半径,然后生成一个宽度和的两倍高度(直径)...

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

所以,本实施例中基本绘制一个矩形围绕的230x300点与200(半径的宽度/高度= 100)和通过这点绘制线条来说明中心点,然后椭圆得出关于...

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

     } 
    } 

} 

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