Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ImageIcon的2D阵列';s在JPanel中显示不一致且仅部分显示_Java_Swing_Multidimensional Array_Jframe_Jpanel - Fatal编程技术网

Java ImageIcon的2D阵列';s在JPanel中显示不一致且仅部分显示

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

我正在尝试使用ImageIcons、JLabel和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();
    }

}
整个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}
                };