自定义组件不会在JLayeredPane中绘制

时间:2011-10-24 19:22:41

标签: java swing paintcomponent jlayeredpane

我们正在用Java创建一些学校项目。我们想做什么: 有一个JScrollPane作为GUI的一部分,包含JLayeredPane(让我们说“MapPane”)。 MapPane包含国家/地区的地图(在底部),这是带有图标的JLabel。这很好用,MapPane是可滚动的,一切都好。

现在,我们想要添加一些扩展类SpatialElement

的自定义图形元素

每个元素都扩展了SpatialElement类(简化):

public abstract class SpatialElement extends JComponent{
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        // ...
        // ...
        paintElement(g2d);
    }

    public abstract void paintElement(Graphics2D g2d);
}

因此,例如,元素Polygon看起来像(简化):

public class Polygon extends SpatialElement{  // SpatialElement extends JComponent

    ...

    @Override
    public void paintElement(Graphics2D g2d) {

        // set color, stroke etc.
        // ...
        // prepare an array of coordinates and size (as required in drawPolygon method)

        // draw fill
        g2d.fillPolygon(x, y, size);

        // draw polygon
        g2d.drawPolygon(x, y, size);
    }
}

因此,当用户添加新的图形元素时,会调用方法addSpatialElement(在MapPane中):

public class MapPane extends JLayeredPane implements MouseWheelListener, MouseInputListener, Observer{

 //...

     public void addSpatialElement(SpatialElement element) {
         element.updateBounds(); // set bounds of newly created element
         spatialElements.add(element); // local storage of created elements

         add(element, JLayeredPane.DRAG_LAYER + getComponentCount()); // put the element into another (higher) layer
         validate();
         // ???
    }
}

我希望代码简单但足够描述。问题是,即使新创建的组件被添加到MapPane(扩展的JLayeredPane)中,该元素也不会绘制。首先我认为它是由错误的边界(在updateBounds方法中计算)引起的,但它们没问题。

如果我在将其添加到MapPane后直接调用element.repaintComponent(getGraphics()),它会绘制元素,但在与MapPane进行任何交互后(例如调整窗口大小等),MapPane将被重新绘制,因此对象赢了重新粉刷。

如何强制MapPane重新调整resize中包含的所有组件?我是否必须覆盖MapPane的默认paintComponent方法(因此我将遍历该对象并在每个方法上调用repaintComponent())?

或者有更好的,不是那么棘手的解决方案怎么做?

感谢您的建议。

0 个答案:

没有答案