【问题标题】:Paint an image on parent component在父组件上绘制图像
【发布时间】:2017-10-11 22:11:22
【问题描述】:

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

我有一个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);
    }
}

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

我想在单元格中绘制一个图像,该图像将显示在其他单元格的顶部,即从单元格中绘制一个比单元格更大的图像,例如:

@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 ]等等……

【问题讨论】:

    标签: java image swing graphics


    【解决方案1】:

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

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

    所以背景图片是地图并覆盖了整个面板。然后房子会被画在地图上。

    所以在父组件中覆盖paintComponent() 并绘制背景图像

    然后在CellPanel 中,覆盖paintComponent() 并绘制前景图像。不过,您为什么不直接使用带有 ImageIcon 的 JLabel,这样您就不需要进行自定义绘画了?

    如果我在 [1,1] 方格上画了一个 3*3 小时,

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

    另一种选择是忘记将地图定义为单元格。相反,您创建一个具有两个属性的自定义对象:

    1. 点 - 背景地图上的一个点
    2. 图像 - 在该点绘制的图像。

    然后将此自定义对象添加到 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. 将两个面板的大小设置为相同。

    或者您可以使用JLayeredPane

    【讨论】:

    • 我使用paintComponent 绘制背景,我使用paint 绘制前景,因为它在paintComponent 上绘制。我不想覆盖父级中的paintComponent,因为在特定单元格上调用了repaint。所以我必须处理单元格内的信息。有没有办法从我的单元格类中覆盖 super.paintComponent 方法?
    • 附带说明:每个单元格的背景是不同的图像。如果你知道的话,我正在做一些看起来像 RPGMaker 的东西。
    • 我觉得我的问题不太清楚,我也编辑了它:p LayeredPane 似乎是最好的方法,我正在查找它
    • 终于接受了:D 部分工作结束了(即,在重绘时背景绘制在前景上),但这是我遇到的另一个问题。感谢您的帮助和指出 LayeredPane。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 2017-07-05
    • 2012-11-24
    • 1970-01-01
    相关资源
    最近更新 更多