如何在 JFrame 中设置 JPanel 的大小?
How do I set the size of a JPanel inside a JFrame?
我想为我的地图和后来的迷你地图创建一个自定义大小的 JPanel,地图生成器和 spritesheet reader 工作正常,但是当我将 JPanel 设置为与 JFrame 不同的大小时,我使用setSize() 或 setBounds() 和 运行 程序,它与 JFrame 保持相同的尺寸。
主要class:
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 class:
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 的结果。你有(至少)两个选择:
- 将 Main class 父级的 LayoutManager 设置为 null
- 将 Main class 放在 JScrollPane 中。 JScrollPane 不会调整 JPanel 的大小,而是使用其 preferredSize(您可以设置)。
我想为我的地图和后来的迷你地图创建一个自定义大小的 JPanel,地图生成器和 spritesheet reader 工作正常,但是当我将 JPanel 设置为与 JFrame 不同的大小时,我使用setSize() 或 setBounds() 和 运行 程序,它与 JFrame 保持相同的尺寸。
主要class:
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 class:
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 的结果。你有(至少)两个选择:
- 将 Main class 父级的 LayoutManager 设置为 null
- 将 Main class 放在 JScrollPane 中。 JScrollPane 不会调整 JPanel 的大小,而是使用其 preferredSize(您可以设置)。