Java ImageIcon的2D阵列';s在JPanel中显示不一致且仅部分显示
我正在尝试使用ImageIcons、JLabel和JPanel创建一个满是16x16地板砖的屏幕。我的问题是,每当我尝试使用2D数组显示这些平铺时,即使重复使用绘图方法,它们也不会完全显示。相反,它们只显示几个磁贴,而不是完整的阵列。此外,每次运行程序时显示的平铺数量都会发生变化 以下是我使用的代码:Java ImageIcon的2D阵列';s在JPanel中显示不一致且仅部分显示,java,swing,multidimensional-array,jframe,jpanel,Java,Swing,Multidimensional Array,Jframe,Jpanel,我正在尝试使用ImageIcons、JLabel和JPanel创建一个满是16x16地板砖的屏幕。我的问题是,每当我尝试使用2D数组显示这些平铺时,即使重复使用绘图方法,它们也不会完全显示。相反,它们只显示几个磁贴,而不是完整的阵列。此外,每次运行程序时显示的平铺数量都会发生变化 以下是我使用的代码: import java.awt.Color; import java.awt.image.BufferedImage; import java.io.File; import java.io.IO
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();
}
}
整个3x3网格的图像大约有一半时间会出现,另一半时间只显示一到两个图像
可以实施哪些变通方法来解决此问题
计算机规格:
视窗10
i8-8700
1080钛
16gb内存您的基本问题是误解。。。欢迎来到我的世界
panel.setLayout(null)
如果您不想使用布局管理器,您可能会更幸运地使用自定义绘制路线。就布局管理器而言,GridLayout
可能是此GUI的最佳选择。但是除了@MadProgrammer的建议之外,请注意,设置顶级容器可见,应该在添加所有组件之后进行。感谢您不仅提供了详尽的答案,而且还提供了许多有用的知识!然而,我不得不问——为什么要在许多变量中添加受保护和静态变量?在我的测试中,没有这些修饰符,它工作得很好。首先,它们只在TestPane
的上下文中有意义,我看不出任何其他类需要访问/修改它们,其次,它们永远不会改变(或应该永远不会改变),所以它们可以是静态的,这节省了一点内存,但说明了您对如何使用它们的意图;)
final int[][] MAP =
{
{1, 1, 1},
{1, 1, 1},
{1, 1, 1}
};