2009-12-02 38 views
1

我有一个JPanel为其设置了一些图像作为背景。我需要在图像上绘制一堆圆圈。现在圆将根据某个坐标x,y定位,并且大小将基于某个整数大小。这就是我的班级。如何在JPanel上画圆? Java 2D

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Image; 
import javax.swing.JPanel; 

class ImagePanel extends JPanel { 

    private Image img; 
    CircleList cList; //added this 

    public ImagePanel(Image img) { 
     this.img = img; 
     Dimension size = new Dimension(img.getWidth(null), img.getHeight(null)); 
     setPreferredSize(size); 
     setMinimumSize(size); 
     setMaximumSize(size); 
     setSize(size); 
     setLayout(null); 

     cList = new CircleList(); //added this 
    } 

    public void paintComponent(Graphics g) { 
     g.drawImage(img, 0, 0, null); 

     cList.draw(null); //added this 
    } 
} 

如何创建一些可以执行此操作的方法?

+0

我刚刚看到Ellipse2D需要double或float,我想我可以使用double来表示大小。 – user69514 2009-12-02 22:52:09

回答

2

你的方法可能与此类似,在您使用类CircleList举行各界和绘图程序太:

class CircleList 
{ 
    static class Circle 
    { 
    public float x, y, diameter; 
    } 

    ArrayList<Circle> circles; 

    public CirclesList() 
    { 
    circles = new ArrayList<Circle>(); 
    } 

    public void draw(Graphics2D g) // draw must be called by paintComponent of the panel 
    { 
    for (Circle c : circles) 
     g.fillOval(c.x, c.y, c.diameter, c.diameter) 
    } 
} 
+0

好吧,所以我创建了CircleList链表中的两个任意圆。当我在ImagePanel类中调用circleList.draw(null)时,什么都不会发生。 GUI实际上冻结了。我称之为draw方法的参数是什么? – user69514 2009-12-02 23:52:09

+0

我在原始文章中指出了我添加的东西 – user69514 2009-12-02 23:54:25

+0

好吧,我只是将g转换为Graphics2D。谢谢 – user69514 2009-12-03 00:14:39

1

最简单的事情就是沿着这些线放置东西到你的paintComponent方法。

int x = ...; 
int y = ...; 
int radius = ...; 
g.drawOval(x, y, radius, radius); 
+0

-1使用getGraphics()将不起作用。是的,它会画一次椭圆形,但只要JAVA确定面板需要重新绘制,它就会被移除。自定义绘画是通过覆盖paintComponent()方法完成的。 – camickr 2009-12-02 23:03:10

+0

你在开玩笑吗?然后,离开'getGraphics()'并将代码移动到'paintComponent'方法中。 – jitter 2009-12-02 23:49:40

+0

@camickr。 thx给你,虽然我基本上给出了与杰克相同的答案我在-1 – jitter 2009-12-03 02:01:06

1

那么,你可能会想创建一个ArrayList来存储关于要绘制的圆的信息。然后,在调用paintComponent()方法时,您只需遍历ArrayList并绘制圆。

Custom Painting Approaches显示了这可能是如何做一个矩形。您可以修改椭圆的代码,也可以添加方法来使用位置信息更新数组,而不是动态地执行此操作。

1

你看着JXLayer?这是一个非常棒的库,它允许您以一种明显的方式在任何GUI元素上绘制特殊的绘画。我相信这将包括在JDK7的主要java库中