Jpanel 尺寸不正确
Jpanel size not correct
所以我正在尝试使用 swing、JFrame 和 JPanel 制作一个类似 Pacman 的游戏,尺寸为 256x256;然而,当我实际编译游戏时,屏幕有点大。我不知道是因为没有正确覆盖方法还是可能是布局问题。
这是我的 JFrame class,它添加了一个 JPanel
*请注意,我已经注释掉了一些内容,因为我想弄清楚它们是否有帮助。
public class GameDevelopment extends JFrame{
//Window Stuff ... hopefully
public static final int DimensionHeight = 256;
public static final int DimensionWidth = 256;
// Level stuff possibly
Tile startingTile;
Player player;
Walls walls;
public static Tile[][] tiles;
public GameDevelopment(){
//Initialize
tiles = new Tile[DimensionWidth/16 ][DimensionHeight/16];
for(int i = 0; i < DimensionWidth/16; i++){
for(int y = 0; y < DimensionHeight/16; y++){
tiles[i][y] = new Tile(i, y);
}
}
startingTile = tiles[tiles.length/2][tiles[0].length/2];
//xStart = (tiles.length/2) * 16;
//yStart = (tiles[0].length/2) * 16;
walls = new Walls();
player = new Player(startingTile);
//Sceen stuff
setTitle("Game");
addKeyListener(player);
addMouseListener(player);
add(new Draw(walls, player), BorderLayout.CENTER);
//setSize(DimensionWidth, DimensionHeight);
pack();
setLocationRelativeTo(null);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args){
SpriteSheet.getSprites();
//Create tiles
GameDevelopment game = new GameDevelopment();
}
我知道如果您添加一个组件并调用 pack() 它会将 jframe 设置为组件大小,所以我不确定是什么问题。
这是我绘制屏幕的 Jpanel class。我还手动在矩形中绘制了屏幕应该是什么样子,屏幕显然比它应该是的要大。
*注意我传入了各种具有绘制方法的 classes 并使用单个 paintComponent 从这个 class 调用这些方法,它可能没有很好地优化但不应该是问题所在。
public class Draw extends JPanel{
//Size
int DimensionHeight;
int DimensionWidth;
// Components
ArrayList components;
int amount;
public Draw(DrawGraphics ... _components){
//Size
DimensionWidth = GameDevelopment.DimensionWidth;
DimensionHeight = GameDevelopment.DimensionHeight;
//this.setPreferredSize(new Dimension(256, 256));
//setMinimumSize(new Dimension(DimensionWidth, DimensionHeight));
//setMaximumSize(new Dimension(DimensionWidth, DimensionHeight));
//setSize(DimensionWidth, DimensionHeight);
setBackground(new Color(80, 0, 255));
System.out.println(getMinimumSize());
//Components
components = new ArrayList();
components.addAll(Arrays.asList(_components));
amount = components.size();
}
@Override
public Dimension getPreferredSize(){
return new Dimension(DimensionWidth, DimensionHeight);
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
for(int i = 0; i < 16; i++){
for(int y = 0; y < 16; y++){
g.drawRect(i*16, y*16, 16, 16);
}
}
for(int i = 0; i < amount; i++){
((DrawGraphics)components.get(i)).draw(g);
}
//g.drawRect(0, 0, 16, 16);
repaint();
}
结果我得到了这张照片,
它在绘制的矩形后显示一些蓝色 space:
感谢您的帮助!
不要在绘画方法中调用 repaint()。这将导致无限循环。
It shows some blue space after the drawn rectangles:
setResizable(false);
pack();
setLocationRelativeTo(null);
// setResizable(false);
在打包框架之前,您需要使框架不可调整大小。
所以我正在尝试使用 swing、JFrame 和 JPanel 制作一个类似 Pacman 的游戏,尺寸为 256x256;然而,当我实际编译游戏时,屏幕有点大。我不知道是因为没有正确覆盖方法还是可能是布局问题。
这是我的 JFrame class,它添加了一个 JPanel
*请注意,我已经注释掉了一些内容,因为我想弄清楚它们是否有帮助。
public class GameDevelopment extends JFrame{
//Window Stuff ... hopefully
public static final int DimensionHeight = 256;
public static final int DimensionWidth = 256;
// Level stuff possibly
Tile startingTile;
Player player;
Walls walls;
public static Tile[][] tiles;
public GameDevelopment(){
//Initialize
tiles = new Tile[DimensionWidth/16 ][DimensionHeight/16];
for(int i = 0; i < DimensionWidth/16; i++){
for(int y = 0; y < DimensionHeight/16; y++){
tiles[i][y] = new Tile(i, y);
}
}
startingTile = tiles[tiles.length/2][tiles[0].length/2];
//xStart = (tiles.length/2) * 16;
//yStart = (tiles[0].length/2) * 16;
walls = new Walls();
player = new Player(startingTile);
//Sceen stuff
setTitle("Game");
addKeyListener(player);
addMouseListener(player);
add(new Draw(walls, player), BorderLayout.CENTER);
//setSize(DimensionWidth, DimensionHeight);
pack();
setLocationRelativeTo(null);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args){
SpriteSheet.getSprites();
//Create tiles
GameDevelopment game = new GameDevelopment();
}
我知道如果您添加一个组件并调用 pack() 它会将 jframe 设置为组件大小,所以我不确定是什么问题。
这是我绘制屏幕的 Jpanel class。我还手动在矩形中绘制了屏幕应该是什么样子,屏幕显然比它应该是的要大。
*注意我传入了各种具有绘制方法的 classes 并使用单个 paintComponent 从这个 class 调用这些方法,它可能没有很好地优化但不应该是问题所在。
public class Draw extends JPanel{
//Size
int DimensionHeight;
int DimensionWidth;
// Components
ArrayList components;
int amount;
public Draw(DrawGraphics ... _components){
//Size
DimensionWidth = GameDevelopment.DimensionWidth;
DimensionHeight = GameDevelopment.DimensionHeight;
//this.setPreferredSize(new Dimension(256, 256));
//setMinimumSize(new Dimension(DimensionWidth, DimensionHeight));
//setMaximumSize(new Dimension(DimensionWidth, DimensionHeight));
//setSize(DimensionWidth, DimensionHeight);
setBackground(new Color(80, 0, 255));
System.out.println(getMinimumSize());
//Components
components = new ArrayList();
components.addAll(Arrays.asList(_components));
amount = components.size();
}
@Override
public Dimension getPreferredSize(){
return new Dimension(DimensionWidth, DimensionHeight);
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
for(int i = 0; i < 16; i++){
for(int y = 0; y < 16; y++){
g.drawRect(i*16, y*16, 16, 16);
}
}
for(int i = 0; i < amount; i++){
((DrawGraphics)components.get(i)).draw(g);
}
//g.drawRect(0, 0, 16, 16);
repaint();
}
结果我得到了这张照片, 它在绘制的矩形后显示一些蓝色 space:
感谢您的帮助!
不要在绘画方法中调用 repaint()。这将导致无限循环。
It shows some blue space after the drawn rectangles:
setResizable(false);
pack();
setLocationRelativeTo(null);
// setResizable(false);
在打包框架之前,您需要使框架不可调整大小。