在父组件上绘制图像

时间:2017-05-12 14:32:42

标签: java image swing graphics

我正在开发一个必须绘制地图的应用程序。

我有一个JPanel网格,其中包含JPanel个单元格的二维数组。

我用这个:

public class myCell extends JPanel {
    ...
    @Override
    public void paint(Graphics g){
        super.paint(g);
        if (imageForeground != null) {
            g.drawImage(imageForeground, 0, 0, this);
        }
    }

    @Override
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawImage(imageBackground, 0, 0, this);
    }
}

这会绘制我的背景图像,并将我的前景图像绘制在它上面。

我想在一个单元格中绘制一个图像,该图像将显示在其他单元格的TOP上,即绘制一个比单元格大的图像,来自单元格,如:

@Override
    public void paint(Graphics g){
        super.paint(g);
        super.drawImage(imageForeground, 0, 0, this);
        or
        g.drawImage(imageForeground, 0, 0, this, overflowFromPanel == true);
    }

或者如果可能的话,告诉图像它可能比我的Cell更大。

有关更多信息:

背景细胞的大小均为1 * 1。必须在它传播的所有背景图像上绘制前景图像。

例如,如果我在[1,1]平方上绘制3 * 3小时,它必须超过[1,1],[1,2],[1,3],[2,1] ]等等......

1 个答案:

答案 0 :(得分:3)

自定义绘画是通过覆盖paintComponent()方法完成的,而不是paint()。

  

我正在开发一个必须绘制地图的应用程序。

因此背景图像是地图并覆盖整个面板。然后将房子涂在地图上。

因此,在父组件中,您重写paintComponent()并绘制背景图像

然后在CellPanel中,覆盖paintComponent()并绘制前景图像。虽然,为什么不使用带有ImageIcon的JLabel,所以你不需要自定义绘画?

  

如果我在[1,1]广场画了3 * 3小时,

然后你需要将你的房子图像添加到9个单元格。

另一种选择是忘记将地图定义到单元格中。而是创建一个具有两个属性的自定义对象:

  1. 点 - 背景地图上的一个点
  2. 图像 - 此时要绘制的图像。
  3. 然后将此自定义Object添加到ArrayList。然后在主面板的paintCompont()方法中迭代遍历此ArrayList并在指定位置绘制每个图像。

    @Overide
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
    
        g.drawImage(...); // paint the background
    
        for (each item in the ArrayList)
        {
            Point p = item.getPoint();
            Image image = item.getImage();
            g.drawImage(...);
        }
    }
    

    编辑:

      

    注意:背景是每个细胞的不同图像。

    你为什么使用细胞?听起来你有一个固定大小的网格。因此,您可以将单个单元格图像绘制为更大的BufferedImage,从而为所有单元格生成单个背景图像。然后你可以在背景之上画房子。

    另一种选择是使用OverlayLayout。它允许您将两个面板堆叠在一起。

    所以逻辑就像是:

    JPanel panel = new JPanel();
    panel.setLayout( new OverlayLayout(panel) );
    panel.add( foregroundPanel );
    panel.add( backgroundPanel );
    

    你需要:

    1. 设置" foregroundPanel"透明。
    2. 两个面板都会覆盖paintComponent(...)方法来进行自定义绘制。
    3. 将两个面板的大小设置为相同。
    4. 或者您可以使用JLayeredPane