用Java绘制圆
我想画一个具有以下特性的圆:用Java绘制圆,java,swing,paintcomponent,jcomponent,Java,Swing,Paintcomponent,Jcomponent,我想画一个具有以下特性的圆: 中心是用户第一次在窗口上单击鼠标的点 半径应为首次单击鼠标和释放鼠标(即鼠标拖动)之间的距离长度 以下是我到目前为止所做的,但它没有做我需要它做的事情: package assignment; import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.*; public class DrawCirc
- 中心是用户第一次在窗口上单击鼠标的点
- 半径应为首次单击鼠标和释放鼠标(即鼠标拖动)之间的距离长度
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();
}
}
看起来你正在做这件事
circPanel.set(centerX, centerY, radius, radius);
repaint();
pack();
在错误的位置,除非用户放开鼠标,否则不应绘制圆,因为此时半径已设置,在此之前,半径为0,因此不绘制任何图形。尝试将其移动到
mousererelease
方法。看起来您正在执行
circPanel.set(centerX, centerY, radius, radius);
repaint();
pack();
在错误的位置,除非用户放开鼠标,否则不应绘制圆,因为此时半径已设置,在此之前,半径为0,因此不绘制任何图形。尝试将其移动到
mousererelease
方法。成功,但圆心不在第一次鼠标单击的坐标处。我是如何解决这个问题的呢?drawOval
方法不取椭圆的中心,它取的是左上角的坐标(它也取宽度和高度,而不是半径),你必须修改x,y,半径是drawOval
所期望的值,我刚刚在这里发布了一个问题:我不知道如何解释这一点,我认为你不需要一个新问题。你所需要做的就是取你的圆心和半径,然后做数学运算。这就成功了,但是圆心不在第一次鼠标点击的坐标上。我是如何解决这个问题的呢?drawOval
方法不取椭圆的中心,它取的是左上角的坐标(它也取宽度和高度,而不是半径),你必须修改x,y,半径是drawOval
所期望的值,我刚刚在这里发布了一个问题:我不知道如何解释这一点,我认为你不需要一个新问题。你所需要做的就是取你的中心点和半径,然后做数学运算。总体思路是在一个JPanel上画一个圆,其半径由用户拖动一个按下的鼠标然后释放它来确定。总体思路是在JPanel上画一个圆,其半径由用户拖动一个按下的鼠标然后释放它来确定