gpt4 book ai didi

java - pack() 之后 JFrame 的大小为奇数

转载 作者:行者123 更新时间:2023-12-01 18:26:17 24 4
gpt4 key购买 nike

我有这段代码:

frame.setTitle("SideScroller");
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
Dimension dim = new Dimension(1000, 500);
frame.setContentPane(gamePanel); //gamePanel is an extended JPanel
gamePanel.setPreferredSize(dim);
frame.pack();

在我运行此代码并用 50x50p 的部分填充 gamePanel 后,这应该完全填充 gamePanel 以及 frame ,有屏幕右侧和底部有一些空像素行。

frame.getSize();    //gives us: 1016 x 539
frame.getInsets(); //gives: Top: 31 | Left: 8 | Bottom: 8 | Right: 8

结果图像:

JFrame after pack()
正如您所看到的,JFrame 中仍然有一些空闲空间。

填充gamePanel的代码:

//Fill the panel with landscape
//One part : 50x50 px
//Panel : 1000x500 px
//Width : 20 prts
//Height : 10 prts
@Override
public void paint(Graphics g){
super.paint(g);
for(int i = 0; i < 20; i++){
for(int j = 0; j < 10; j++){
//Decide which landscape-img should be used
switch(levelOne[j][i]){
case 0:g.drawImage(new ImageIcon("resources\\landscape-img\\air.png")
.getImage(), 50 * i, 50 * j, null);
break;
case 1:g.drawImage(new ImageIcon("resources\\landscape-img\\ground.png")
.getImage(), 50 * i, 50 * j, null);
break;
}
}
}
g.dispose();
}

我不明白为什么框架没有完全填满。希望有人能帮助我!

最佳答案

一些提示可以帮助您解决问题。

1) 如果您需要游戏面板具有首选尺寸,则只需重写 getPreferredSize() 即可,如下所示:

public class GamePanel extends JPanel {
...
@Override
public Dimension getPreferredSize() {
return isPreferredSizeSet()
? super.getPreferredSize() : new Dimension(1000, 500);
}
...
}

另请参阅Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?

2) 请注意,您不应重写 paint() 方法,而应重写 paintComponent() 方法。请参阅A Closer Look at the Paint Mechanism .

public class GamePanel extends JPanel {
...
@Override
protected void paintComponent(Graphics g) {
// Your implementation here
}
...
}

3) 正如已经建议的,只需将您的 gamePanel 直接添加到框架的内容 Pane 中即可:

frame.getContentPane().add(gamePanel);

这样您就可以利用其默认布局管理器:BorderLayout使您的面板填满整个中心区域。

4) 最后,虽然您可以完美地使用 Swing 来制作游戏,但它并不是最好的 API,因为它是为桌面应用程序设计的。您可能需要考虑使用一些用于游戏开发的库,例如

关于java - pack() 之后 JFrame 的大小为奇数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26065368/

24 4 0
文章推荐: iphone - 如何在 iOS 中使用动态部分对 tableview 进行分组
文章推荐: java - Android 将 ArrayList 保存为 SharedPreference