【问题标题】:Drawing image behind border in Swing JPanel在 Swing JPanel 中的边框后面绘制图像
【发布时间】:2015-10-23 05:43:23
【问题描述】:

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

在该布局中,我有 5 列和 4 行,每行都有一个“大单元格”。

“大单元格”扩展JPanel 并具有边框颜色,而在“大单元格”内是一个“小单元格”,它也扩展了JPanel 并具有边框颜色。 16x16 网格内的小单元的大单元。

我正在尝试绘制图像,但它仅在绘制完其他所有内容(边框、背景等)后才绘制图像

但我想先画图,再画边框。

我不能对单个单元格使用 setIcon,因为它不绘制图像(不知道为什么),它使我的网格变大了 10 倍,并且程序溢出如此之大,以至于它甚至不适合 4k 分辨率.

这是它的样子

我希望每个黑色“盒子”或“大单元格”都有自己的背景图像,该图像在带有橙色边框的小单元格后面绘制或渲染。

这是绘制图像后的样子

您可能无法分辨,但这就是在每个“大单元格”中呈现的图像,除了它在所有东西的前面。它看起来只有 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);
    }
}

还有 'Cell' 类,它是一个带有橙色边框的小盒子

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);

    }


}

【问题讨论】:

  • 考虑提供一个runnable example 来证明您的问题。这不是代码转储,而是您正在做的事情的一个例子,它突出了您遇到的问题。这将减少混乱并获得更好的响应
  • @MadProgrammer 我认为图像就足够了,但如果不是,我将添加一个可运行的示例。
  • 嗯,我基本上不知道你做事的顺序或者组件的布局是什么。绘制背景可能很棘手。您可以让所有组件透明并通过容器 paintComponent 方法绘制图像,但我不知道这是否适用于这种情况

标签: java swing jpanel draw


【解决方案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);
    }
}

paintComponentpaintBorderpaintChildren 之前被调用,因此它是绘制背景图像的理想场所

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

查看Performing Custom PaintingPainting in AWT and Swing,了解更多关于如何在 Swing 中进行绘画的详细信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 2014-04-02
    相关资源
    最近更新 更多