【发布时间】: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方法绘制图像,但我不知道这是否适用于这种情况