2012-04-18 26 views
0

我想要繪製具有後續特性的圓:繪製cricle

  • 中心是其中用戶首先點擊鼠標的窗口上的點
  • 半徑應之間的距離的長度第一次點擊鼠標並釋放時(即拖動鼠標)。

這裏就是我有這麼遠,但它沒有做什麼,我需要做的:

package assignment; 

import java.awt.*; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

import javax.swing.*; 

public class DrawCircle extends JFrame implements MouseListener 
{ 
    private int centerX; 
    private int centerY; 
    private int endPtX; 
    private int endPtY; 
    private double radius; 
    private double w; 
    private double h; 
    private CirclePanel circPanel; 

    /** constructor **/ 
    public DrawCircle() 
    { 
     this.setTitle("Click to Draw Circle"); 
     this.setSize(500, 500); 
     this.setPreferredSize(new Dimension(500, 500)); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setVisible(true); 
     this.setResizable(false); 
     this.addMouseListener(this); 
     this.circPanel = new CirclePanel(); 
     this.circPanel.setPreferredSize(new Dimension(500, 500)); 
     this.add(this.circPanel); 
     pack(); 
    } 

    public void mousePressed(MouseEvent e) 
    { 
     centerX = e.getX(); 
     centerY = e.getY(); 
     circPanel.set(centerX, centerY, radius, radius); 
     repaint(); 
     pack(); 
    } 

    public void mouseReleased(MouseEvent e) 
    { 
     endPtX = e.getX(); 
     endPtY = e.getY(); 

     radius = Math.sqrt(Math.pow(endPtX - centerX, 2) + Math.pow(endPtY - centerY, 2)); 
    } 
    public void mouseEntered(MouseEvent e) {} 
    public void mouseExited(MouseEvent e) {} 
    public void mouseClicked(MouseEvent e){} 



    //circle panel 
    private class CirclePanel extends JComponent 
    { 
     private int x; 
     private int y; 
     private int w; 
     private int h; 

     public void set(int x, int y, double width, double height) 
     { 
      this.x = x; 
      this.y = y; 
      w = (int) width; 
      h = (int) height; 
     } 

     public void paintComponent(Graphics g) 
     { 
      g.drawOval(x, y, w, h); 
     } 
    } 

    //main method 
    public static void main (String [] args) 
    { 
     new DrawCircle(); 
    } 
} 
+1

它在做什麼? – twain249 2012-04-18 21:31:36

+0

總體思路是在JPanel上繪製一個圓,其半徑由用戶拖動一個按下的鼠標然後釋放它決定 – Haque1 2012-04-18 22:43:04

回答

1

看起來你是在錯誤的地方,你不該做

circPanel.set(centerX, centerY, radius, radius); 
repaint(); 
pack(); 

在用戶放開鼠標之前不要繪製圓,因爲這是半徑設置的時候,並且在此之前半徑爲0,所以沒有繪製任何東西。嘗試將其移至mouseReleased方法。

+0

這樣做了,但圓的中心不在第一次鼠標單擊的座標處。我是如何解決這個問題的? – Haque1 2012-04-18 22:41:42

+0

'drawOval'方法不佔用左上角座標中的橢圓的中心(它也取決於寬度和高度,而不是半徑),您將不得不修改x,y的值,和半徑的預期值'drawOval' – twain249 2012-04-18 22:43:26

+0

我剛在這裏發佈了一個問題:http://stackoverflow.com/questions/10219349/java-is-there-any-easy-way-to-draw-a-圈到jpanel我不知道如何解釋這個 – Haque1 2012-04-18 23:03:50