Java:通过静态大小调整和定位将JComponents添加到JPanel

Java:通过静态大小调整和定位将JComponents添加到JPanel,java,swing,svg,graphics2d,jcomponent,Java,Swing,Svg,Graphics2d,Jcomponent,我有一个程序,可以在java应用程序中读取和绘制SVG文件,而无需使用第三方库。我已经到了可以通过在图形对象上绘制形状来复制文件的地步,但是我希望通过对每个对象应用侦听器来选择每个元素(Rect/Circle/Line等) 为此,我的印象是,我需要创建一个类来扩展JComponent,在组件中绘制对象,并为要显示的每个元素向其添加一个侦听器。因此,我将有一组容器组件(如果您可以这样称呼它们的话),并附加侦听器,每个侦听器对应于文件中的特定元素 然后,我需要将这些组件绘制到JPanel或合适的容器

我有一个程序,可以在java应用程序中读取和绘制SVG文件,而无需使用第三方库。我已经到了可以通过在图形对象上绘制形状来复制文件的地步,但是我希望通过对每个对象应用侦听器来选择每个元素(Rect/Circle/Line等)

为此,我的印象是,我需要创建一个类来扩展JComponent,在组件中绘制对象,并为要显示的每个元素向其添加一个侦听器。因此,我将有一组容器组件(如果您可以这样称呼它们的话),并附加侦听器,每个侦听器对应于文件中的特定元素

然后,我需要将这些组件绘制到JPanel或合适的容器上,但是要这样做,我需要使用空布局并手动设置JPanel/容器中每个组件的位置和大小

总之,虽然这正是我想要做的,但我想知道是否有一种更标准化的方法可以将监听器添加到我不知道的图形对象中

这里是一个有问题的代码示例,我希望通过使用上述方法来扩展它,我已经对它进行了很多简化,所以我希望它仍然有意义

public class View extends JComponent implements SVGViewport {

    // Model of the SVG document
    private SVGDocument document;

    /** Paint method */
    @Override
    protected void paintComponent(Graphics g) {
        paint2D((Graphics2D) g);
    }

    /** Paints the entire view */
    private void paint2D(Graphics2D g) {
        // Paint Document properties
        ....

        // Paint document Elements
        for (SVGElement elem : document) {  
            paintElement(g, elem);
        }
    }

    /** Paints a single element on the graphics context */
    public void paintElement(Graphics2D g, SVGElement elem) {

        //Get a drawable shape object for this element
        Shape shape = elem.createShape();

        //Set Fill, stroke, etc attributes for this shape
        ....
        // Fill the interior of the shape
        ....
        // Stroke the outline of the shape
        ....
        g.draw(shape);
    }

    /** Gets the document currently being displayed by the view. */
    public SVGDocument getDocument() {
        return document;
    }

    /** set and re-paint the document */
    public void setDocument(SVGDocument document) {
        this.document = document;
        repaint();
    }
}
OOdium

您描述的内容听起来很合理,据我所知,2D API中没有对事件的本地支持。如果视觉元素之间存在重叠,则必须小心。另一种方法是在画布(Z-order或玻璃窗格)顶部有一个
JComponent
,负责确定单击了哪个项目,然后触发相应的事件。如果存在重叠的视觉实体,这可能是必要的。以下是Sun关于分层的文档:

我不是一个图形专家,我希望有一个标准的解决方案来满足你的需求,因为程序员经常会想做你想做的事情。您可能想尝试谷歌搜索Java内置的2D游戏,看看是否可以从中学习

问候,

如图所示,Guido是传统的方法。在中可以看到使用
paintComponent()
的替代方法


附录:关于,也请参见这个,这个相关的,还有这个。

我知道必须有一个更好的方法,JLayeredPane正是我想要的!谢谢你。我在上面添加了一些相关链接。+1游戏和模拟游戏通常都是丰富的创意来源。另请参阅。