包装后JFrame奇数的大小()

时间:2014-09-26 17:43:20

标签: java swing jframe

我有这段代码:

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 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();
}

我不明白为什么frame没有完全填满。希望有人可以帮助我!

2 个答案:

答案 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,因为它是专为桌面应用程序设计的。您可能需要考虑使用一些用于游戏开发的库,例如

答案 1 :(得分:0)

找到答案here。我在调用frame.setResizable(false)之后打电话给frame.pack() ,显然会混淆frame。您必须在 pack()之前调用(或`setVisible(true))。