2014-04-16 70 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