【问题标题】:Java: Adding JComponents to a JPanel with static sizing and positioningJava:将 JComponents 添加到具有静态大小和定位的 JPanel
【发布时间】:2011-08-05 18:53:27
【问题描述】:

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

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

然后我需要将这些组件绘制到 JPanel 或合适的 Container 上,但是为此我需要使用 null 布局并手动设置 JPanel/Container 中每个组件的位置和大小。

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

这是我希望使用上述方法扩展的相关代码示例,我已经对其进行了很多简化,因此我希望它仍然有意义

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();
    }
}

【问题讨论】:

标签: java swing svg graphics2d jcomponent


【解决方案1】:

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

附录:关于JLayeredPane,另见tutorial、相关examplevariation

【讨论】:

  • 我知道必须有更好的方法 JLayeredPane 正是我所追求的!谢谢
  • 优秀。我在上面添加了一些相关链接。
【解决方案2】:

Odium,

您所描述的内容当然听起来很合理,而且据我所知,2D API 中的事件本身并不支持。如果视觉元素之间存在重叠,则必须小心。另一种解决方法是在画布(Z 顺序或玻璃窗格)顶部有一个JComponent,负责确定单击了哪个项目,然后触发适当的事件。如果存在重叠的视觉实体,这可能是必要的。以下是 Sun 的分层文档:http://download.oracle.com/javase/tutorial/uiswing/components/rootpane.html

虽然我不是图形专家,但我希望有一个标准的解决方案来满足您的要求,因为程序员想要做您想做的事情的频率。您可能想尝试在 Google 上搜索用 Java 构建的 2D 游戏,看看您是否可以从他们所做的事情中学习。

问候,

圭多

【讨论】:

  • +1 游戏和一般模拟是丰富的创意来源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
  • 2011-02-25
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多