Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.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 如何在JFrame中设置JPanel的大小?_Java_2d Games - Fatal编程技术网

Java 如何在JFrame中设置JPanel的大小?

Java 如何在JFrame中设置JPanel的大小?,java,2d-games,Java,2d Games,我想为我的地图和更高版本的迷你地图创建一个自定义大小的JPanel,地图生成器和spritesheet阅读器工作正常。但是,当我将JPanel设置为与JFrame不同的大小,然后使用setSize()或setBounds()并运行程序时,它的尺寸与JFrame相同 主要类别: import java.awt.Color; import java.awt.image.BufferedImage; import java.util.Random; import javax.swing.ImageI

我想为我的地图和更高版本的迷你地图创建一个自定义大小的JPanel,地图生成器和spritesheet阅读器工作正常。但是,当我将JPanel设置为与JFrame不同的大小,然后使用setSize()或setBounds()并运行程序时,它的尺寸与JFrame相同

主要类别:

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main extends JPanel {

    private static SpriteSheet sc = new SpriteSheet();

    private static JLabel[][] mapTiles = new JLabel[40][40];
    private static int[][] mapTileCode = new int[40][40];

    public Main() {

        JFrame f = new JFrame();
        setLayout(null);
        this.setSize(625, 625);

        f.add(this);
        f.setSize(1000, 1000);
        f.setUndecorated(true);
        f.setLocationRelativeTo(null);
        this.setBackground(new Color(150, 150, 150));
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }

    public static void main(String args[]) {

        new Main().mapSetup();

    }

    public void mapSetup() {

        Random r = new Random();

        for (int x = 0; x < 40; x++) {
            for (int y = 0; y < 40; y++) {

                int l = r.nextInt(6);
                BufferedImage i = sc.getTile(l);

                ImageIcon im = new ImageIcon(i);

                mapTileCode[y][x]=l;
                mapTiles[y][x] = new JLabel(im);
                mapTiles[y][x].setBounds(y * 25, x * 25, 25, 25);
                this.add(mapTiles[y][x]);
                repaint();

            }
        }
    }

}

您看到的结果是LayoutManager的结果。您(至少)有两种选择:

  • 将主类父类的LayoutManager设置为null
  • 将主类放在JScrollPane中。JScrollPane不会调整JPanel的大小,而是使用它的preferredSize(可以设置)

  • @SimplePrograms如果有机会,请单击此答案旁边的复选标记以标记所回答的问题。
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    
    import javax.imageio.ImageIO;
    
    public class SpriteSheet {
    
        final int W = 25;
        final int H = 25;
    
        BufferedImage spriteSheet;
    
        public BufferedImage getTile(int tile) {
    
            if (new File("img/SpriteSheet.png").exists()) {
                try {
                    spriteSheet = ImageIO.read(new File("img/SpriteSheet.png"));
                } catch (IOException e) {
                    e.printStackTrace();
                }
    
                int tileX = 1 + tile + (tile * 25);
                int tileY = 1 + (0 * 25);
    
                return spriteSheet.getSubimage(tileX, tileY, 25, 25);
    
            } else {
    
                System.err.println("no files found");
    
                return null;
    
            }
    
        }
    
    }