Ellipse2D e = new Ellipse2D.Double(150, 200, 100, 50);
这个e 能加到jpanel上去么? 如jp.add(e)?
paint一下就可以了,看看你的jpanel的事件,好象有个jpanel.paint(Graphics g) public void paint(Graphics g) { g.drawPolyline(int [] x, int [] y ,int pointNum); }利用楼上的Ellipse2D e = new Ellipse2D.Double(150, 200, 100, 50);,然后分别算出这个圆经过的点,一般60份差不多,也就是61个点,第一个和最后一个重合,利用上面的方法,但是好像上面的方法你需要改进一下,因为它的参数是int的,而算出来的则不可能是整形的,如果你需要很精确,可以取原上的更多的点。 你还可以考虑用drawArc来画,可是这个方法中我不懂其中的一个参数的意思。
重载public void paint(Graphics g) {在这里做你画图,用g.画吧}
还是来一个现成的吧,代码如下,不过并不只是画圆: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class CircumCircle { public static void main(String[] args) { new JFCir().show(); } } class JPCir extends JPanel { long diameter,x1,x2,y1,y2,cX,cY,radious; long startX,startY; public JPCir() { addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent m) { x1=m.getX(); y1=m.getY(); //System.out.println(x1+","+y1); } public void mouseReleased(MouseEvent m) { x2=m.getX(); y2=m.getY(); diameter=Math.round(Math.sqrt(Math.pow(x2-x1,2)+Math.pow(y2-y1,2))); cX=Math.abs(x2-x1); cY=Math.abs(y2-y1); radious=diameter/2; startX=cX-radious; startY=cY-radious; //System.out.println(x2+","+y2); repaint(); } } ); } public void paintComponent(Graphics g) { int x1,y1,x2,y2,startX,startY,diameter,cX,cY; super.paintComponent(g); g.setColor(Color.RED); cX=(int)this.cX; cY=(int)this.cY; x1=(int)this.x1; y1=(int)this.y1; x2=(int)this.x2; y2=(int)this.y2; System.out.println(x1+","+y1); startX=(int)this.startX; startY=(int)this.startY; diameter=(int)this.diameter; g.drawLine(x1,y1,x2,y2); g.setColor(new Color(255,0,255)); g.drawRect(startX,startY,diameter,diameter); g.setColor(Color.GREEN); g.drawOval(startX,startY/2,diameter,diameter); g.setFont(new Font("黑体",Font.BOLD,15)); g.setColor(Color.BLACK); g.drawString("O",cX,cY); } } class JFCir extends JFrame { public JFCir() { setTitle("画圆和直线"); setSize(600,400); //getComponent().add getContentPane().add(new JPCir()); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
如jp.add(e)?
public void paint(Graphics g) {
g.drawPolyline(int [] x, int [] y ,int pointNum);
}利用楼上的Ellipse2D e = new Ellipse2D.Double(150, 200, 100, 50);,然后分别算出这个圆经过的点,一般60份差不多,也就是61个点,第一个和最后一个重合,利用上面的方法,但是好像上面的方法你需要改进一下,因为它的参数是int的,而算出来的则不可能是整形的,如果你需要很精确,可以取原上的更多的点。
你还可以考虑用drawArc来画,可是这个方法中我不懂其中的一个参数的意思。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class CircumCircle { public static void main(String[] args) {
new JFCir().show();
}
}
class JPCir extends JPanel
{
long diameter,x1,x2,y1,y2,cX,cY,radious;
long startX,startY;
public JPCir()
{
addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent m)
{
x1=m.getX();
y1=m.getY();
//System.out.println(x1+","+y1);
}
public void mouseReleased(MouseEvent m)
{
x2=m.getX();
y2=m.getY();
diameter=Math.round(Math.sqrt(Math.pow(x2-x1,2)+Math.pow(y2-y1,2)));
cX=Math.abs(x2-x1);
cY=Math.abs(y2-y1);
radious=diameter/2;
startX=cX-radious;
startY=cY-radious;
//System.out.println(x2+","+y2);
repaint();
}
}
);
}
public void paintComponent(Graphics g)
{
int x1,y1,x2,y2,startX,startY,diameter,cX,cY;
super.paintComponent(g);
g.setColor(Color.RED);
cX=(int)this.cX;
cY=(int)this.cY;
x1=(int)this.x1;
y1=(int)this.y1;
x2=(int)this.x2;
y2=(int)this.y2;
System.out.println(x1+","+y1);
startX=(int)this.startX;
startY=(int)this.startY;
diameter=(int)this.diameter;
g.drawLine(x1,y1,x2,y2);
g.setColor(new Color(255,0,255));
g.drawRect(startX,startY,diameter,diameter);
g.setColor(Color.GREEN);
g.drawOval(startX,startY/2,diameter,diameter);
g.setFont(new Font("黑体",Font.BOLD,15));
g.setColor(Color.BLACK);
g.drawString("O",cX,cY);
}
}
class JFCir extends JFrame
{
public JFCir()
{
setTitle("画圆和直线");
setSize(600,400);
//getComponent().add
getContentPane().add(new JPCir());
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
画的圆没有填充不是实心圆,应该是:
g.setColor(Color.Green);
g.fillOval(startX,startY/2,diameter,diameter);