在Swing JPanel中绘制图像背后的图像

时间:2015-10-23 05:43:23

标签: java swing jpanel draw

我创建了一个JFrame,其JPanel中包含MigLayout

在该布局中,我有5列4行,每行有一个' Big Cell'在他们中。

' Big Cell'扩展JPanel并具有边框颜色,并且在' Big cell'内。是一个小小区'它还扩展了JPanel并具有边框颜色。小细胞大细胞内的16x16网格。

我正在尝试绘制图像,但它只会在绘制其他所有图像后绘制图像(边框,背景等)

但我想首先绘制图像,然后绘制边框。

我不能将setIcon用于单个单元格,因为它不会绘制图像(不确定原因)并且它使我的网格大10倍并且程序溢出得太大以至于它不会甚至适合4k分辨率。

这是一张它看起来像什么的图片

Cell Example

我想要每个黑盒子'或者' Big Cell'拥有它自己的背景图像,在橙色边框的小细胞后面绘制或渲染。

以下是绘制图像的样子

Cell Example 2

您可能无法分辨,但这是在每个大单元格中呈现的图像'因为它应该除了它在所有东西面前。看起来它只是1张图片,但不要被愚弄,因为它是一张无缝图像。

这里是“BigCell”。我假设的课程是问题的根源。

package com.michaelgates.dev.OldLeaf.gui.components;

import javax.swing.*;
import javax.swing.border.LineBorder;
import java.awt.*;


public class BigCell extends JPanel
{
    int column;
    int row;
    Cell[][] children;

    JPanel parent;
    Image image;


    public BigCell(int column, int row, JPanel parent)
    {
        this.column = column;
        this.row = row;
        this.parent = parent;

        setLayout(new GridLayout(16, 16, 0, 0));
        setBorder(new LineBorder(Color.DARK_GRAY, 2));

        children = new Cell[16][16];
        for (int i = 0; i < 16; i++)
        {
            for (int j = 0; j < 16; j++)
            {
                Cell cell = new Cell(i, j, this);
                add(cell);
                children[i][j] = cell;
            }
        }


        image = Toolkit.getDefaultToolkit().getImage(getClass().getClassLoader().getResource("img/acre/acre_0.png"));
    }


    @Override
    public void paint(Graphics g)
    {
        if (image != null)
        {
            g.drawImage(image, 0, 0, (int) getSize().getWidth() - 0, (int) getSize().getHeight() - 0, this);
        }
        super.paint(g);
    }
}

&#39; Cell&#39;这是一个带有橙色边框的小盒子

package com.michaelgates.dev.OldLeaf.gui.components;

import javax.swing.*;
import javax.swing.border.LineBorder;
import java.awt.*;


public class Cell extends JPanel
{
    int column;
    int row;
    BigCell parent;


    public Cell(int column, int row, BigCell parent)
    {
        this.column = column;
        this.row = row;
        this.parent = parent;

        setBorder(new LineBorder(Color.orange, 1));
        //setBackground(Color.LIGHT_GRAY);

    }


}

1 个答案:

答案 0 :(得分:1)

更改...

@Override
public void paint(Graphics g)
{
    if (image != null)
    {
        g.drawImage(image, 0, 0, (int) getSize().getWidth() - 0, (int) getSize().getHeight() - 0, this);
    }
    super.paint(g);
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    if (image != null) {
        g.drawImage(image, 0, 0, (int) getSize().getWidth() - 0, (int) getSize().getHeight() - 0, this);
    }
}
paintComponentpaintBorder之前调用

paintChildren,因此它是绘制背景图片的理想场所

然后将setOpaque(false);添加到您的Cell构造函数

Background

请查看Performing Custom PaintingPainting in AWT and Swing,了解有关绘画如何在Swing中工作的详细信息