我有这段代码:
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();
运行此代码后,将gamePanel
填入50x50p的部分,这些部分应填充gamePanel
,因此填充frame
,右侧有一些空的像素行和屏幕的底部。
frame.getSize(); //gives us: 1016 x 539
frame.getInsets(); //gives: Top: 31 | Left: 8 | Bottom: 8 | Right: 8
结果图片:
如您所见,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();
}
我不明白为什么frame
没有完全填满。希望有人可以帮助我!
答案 0 :(得分:4)
很少有提示可以帮助您解决问题。
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
直接添加到框架的内容窗格中:
frame.getContentPane().add(gamePanel);
这样您就可以利用其默认的布局管理器:BorderLayout使您的面板填满整个中心区域。
4)最后,虽然你可以完美地使用Swing来制作游戏,但它并不是最好的API,因为它是专为桌面应用程序设计的。您可能需要考虑使用一些用于游戏开发的库,例如libgdx
答案 1 :(得分:0)
找到答案here。我在调用frame.setResizable(false)
之后打电话给frame.pack()
,显然会混淆frame
。您必须在 pack()
之前调用(或`setVisible(true))。