【发布时间】:2019-07-16 02:22:36
【问题描述】:
我正在尝试使用 ImageIcons、JLabels 和 JPanel 创建一个充满 16x16 地砖的屏幕。我的问题是,每当我尝试使用 2D 数组显示这些图块时——即使重复循环绘制方法——它们也不会完全显示。相反,它们只显示几个图块,而不是完整的数组值。此外,每次运行程序时,显示的图块数量都会发生变化!
这是我正在使用的代码:
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class JFrameTest {
static BufferedImage buf;
static JPanel panel;
public static void main(String[] args) {
createWindow();
loadImage();
showImage();
}
public static void createWindow() {
JFrame frame = new JFrame();
panel = new JPanel();
frame.setSize(1000, 1000);
frame.setTitle("Tester");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.add(panel);
frame.setVisible(true);
panel.setLayout(null);
}
public static void loadImage() {
try {
buf = ImageIO.read(new File("res/test.png"));
} catch (IOException ex) {
System.out.println("NOT FOUND");
}
}
public static void showImage() {
final int[][] MAP =
{
{1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1}
};
ImageIcon test = new ImageIcon(buf);
panel.setBackground(Color.WHITE);
System.out.println(test.getIconWidth());
System.out.println(test.getIconHeight());
JLabel[][] labelGrid = new JLabel[MAP.length][MAP[0].length];
for (int r = 0; r < labelGrid.length; r++) {
for (int c = 0; c < labelGrid[r].length; c++) {
labelGrid[r][c] = new JLabel();
labelGrid[r][c].setSize(test.getIconWidth(), test.getIconWidth());
labelGrid[r][c].setLocation(test.getIconWidth() * r, test.getIconHeight() * c);
labelGrid[r][c].setIcon(test);
panel.add(labelGrid[r][c]);
}
}
panel.revalidate();
}
}
这里是关于通常打印的内容:
似乎程序只是放弃了显示图像。但是,请注意,每次显示的图像数量都会发生变化!有时可能只出现 5 张图像,有时 22 张。
当我尝试使用较小的地图时,例如:,
final int[][] MAP =
{
{1, 1, 1},
{1, 1, 1},
{1, 1, 1}
};
整个 3x3 网格的图像将显示大约一半的时间,另一半只显示一到两个图像。
可以实施哪些变通方法来解决此问题?
电脑规格:
Windows 10
i8-8700
1080 钛
16GB 内存
【问题讨论】:
-
panel.setLayout(null);???? ...这将使panel.revalidate()变得多余 -
如果你不想使用布局管理器,使用自定义绘画路线可能会更好
-
就布局管理器而言,
GridLayout可能是此 GUI 的最佳选择。但除了@MadProgrammer 的建议外,请注意,设置顶级容器可见,应该在所有组件添加之后完成。
标签: java swing multidimensional-array jframe jpanel