繁体   English   中英

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

[英]How do I set the size of a JPanel inside a JFrame?

我想为我的地图和后来的迷你地图创建一个自定义大小的 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();

            }
        }
    }

}

SpriteSheet 类:

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;

        }

    }

}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM