2012-04-18 4 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

+0

Общая идея состоит в том, чтобы нарисовать круг на JPanel, радиус которого определяется пользователем, перетаскивая нажатой мышь, а затем высвобождая его. – Haque1

ответ

1

Похоже, что вы делаете

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

в неправильном месте, вы не должны 't нарисуйте круг до тех пор, пока пользователь не отпустит мышь, потому что это когда радиус установлен, и до этого радиус равен 0, поэтому ничего не получается. Попробуйте переместить это на метод mouseReleased.

+0

Это сделало трюк, но центр круга не расположен в координатах первого щелчка мыши , Как я это исправил? – Haque1

+0

Метод 'drawOval' не принимает в центре овала, который он принимает в верхних левых координатах (он также принимает ширину и высоту не радиуса), вам придется изменить значение x, y, и радиус до значений, ожидаемых 'drawOval' – twain249

+0

Я только что разместил вопрос о том, что здесь: http://stackoverflow.com/questions/10219349/java-is-there-any-easy-way-to-draw-a- circle-on-a-jpanel Я не знаю, как объяснить это – Haque1

Смежные вопросы