Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自定义组件赢得';t在JLayeredPane中涂漆_Java_Swing_Paintcomponent_Jlayeredpane - Fatal编程技术网

Java 自定义组件赢得';t在JLayeredPane中涂漆

Java 自定义组件赢得';t在JLayeredPane中涂漆,java,swing,paintcomponent,jlayeredpane,Java,Swing,Paintcomponent,Jlayeredpane,我们正在用Java创建一些学校项目。我们想做什么: JScrollPane是GUI的一部分,包含JLayeredPane(我们称之为“MapPane”)。MapPane包含国家地图(在底部),它是带有图标的JLabel。这很好,地图窗格是可滚动的,一切正常 现在,我们想添加一些扩展类SpatialElement的自定义图形元素 每个元素扩展类SpatialElement(简化): 例如,元素多边形看起来像(简化): 因此,当用户添加新的图形元素时,将调用方法addSpatialElement(在

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

现在,我们想添加一些扩展类SpatialElement的自定义图形元素

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

例如,元素多边形看起来像(简化):

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

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

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

如何强制MapPane在调整大小时重新绘制所有包含的组件?我是否必须重写MapPane的默认paintComponent方法(这样我就可以遍历对象并对每个对象调用RepaitComponent()

或者有没有更好的、不那么棘手的解决办法


谢谢你的建议。

多边形有没有可能与java.awt.Polygon发生冲突?您是否实现了组件侦听器?无冲突。组件侦听器?没有实施,这是为了什么?我想我不需要它。重写
componentresistized()
并调用
repaint()
;看看是否有帮助。您可能必须构造一个显示您描述的问题的。我尝试将一些打印放入
paintComponent
paintElement
中,它们被打印,因此调用了方法,这意味着元素被绘制。。。但是在哪里呢?通常是方法。请用你的答案更新你的问题。更多
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);
}
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);
    }
}
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();
         // ???
    }
}