我创建了一个JFrame
,其JPanel
中包含MigLayout
。
在该布局中,我有5列4行,每行有一个' Big Cell'在他们中。
' Big Cell'扩展JPanel
并具有边框颜色,并且在' Big cell'内。是一个小小区'它还扩展了JPanel
并具有边框颜色。小细胞大细胞内的16x16网格。
我正在尝试绘制图像,但它只会在绘制其他所有图像后绘制图像(边框,背景等)
但我想首先绘制图像,然后绘制边框。
我不能将setIcon用于单个单元格,因为它不会绘制图像(不确定原因)并且它使我的网格大10倍并且程序溢出得太大以至于它不会甚至适合4k分辨率。
这是一张它看起来像什么的图片
我想要每个黑盒子'或者' Big Cell'拥有它自己的背景图像,在橙色边框的小细胞后面绘制或渲染。
以下是绘制图像的样子
您可能无法分辨,但这是在每个大单元格中呈现的图像'因为它应该除了它在所有东西面前。看起来它只是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);
}
}
答案 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);
}
}
在paintComponent
和paintBorder
之前调用 paintChildren
,因此它是绘制背景图片的理想场所
然后将setOpaque(false);
添加到您的Cell
构造函数
请查看Performing Custom Painting和Painting in AWT and Swing,了解有关绘画如何在Swing中工作的详细信息