为什么调用JFrame.pack()会增加额外的空间?

Jas*_*ray 3 java user-interface swing jframe

最初,我使用的代码工作正常,但有点令人费解.将方法的某些部分移动到JFrame的构造函数后,事情正常.

除了使用pack()之外的所有东西都能使框架成为合适的尺寸.

这是原始代码:

public class BaseGameFrame extends JFrame {

public static final int WINDOWED = 0;
public static final int UFS = 1;

protected BaseGamePanel gamePanel;

public BaseGameFrame(String title, int pWidth, int pHeight, long period, int windowType){
    super(title);

    switch(windowType){
        case UFS:
                    this.setUndecorated(true);

                    Rectangle screenSize = this.getGraphicsConfiguration().getBounds();
                    pWidth = screenSize.width;
                    pHeight = screenSize.height;

                    break;

        default:    break;
    }

    this.setVisible(true);
    this.setResizable(false);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    this.createPanel(pWidth, pHeight, period);


}

protected void createPanel(final int pWidth, final int pHeight, long period){
    this.gamePanel = new BaseGamePanel(pWidth, pHeight, period);

    this.add(this.gamePanel);
    this.pack();
}

public static void main(String[] args){
    new BaseGameFrame("Test", 800, 600, 20L * 1000000L, UFS);
}

}
Run Code Online (Sandbox Code Playgroud)

这是在修改它之后:

public class BaseGameFrame extends JFrame {


protected BaseGamePanel gamePanel;

public BaseGameFrame(String title, VideoType vType, BaseGamePanel gp){
    super(title);

    switch(vType){
        case UFS:   
                    this.setUndecorated(true);

                    Rectangle screenSize = this.getGraphicsConfiguration().getBounds();
                    gp.setPDimensions(new Dimension(screenSize.width, screenSize.height));

                    break;

        default:    break;
    }


    this.add(gp);
    this.pack();

    this.setVisible(true);

    this.setResizable(false);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


}

public static void main(String[] args){
    BaseGamePanel gp = new BaseGamePanel(800, 600, 20L * 1000000L);
    new BaseGameFrame("Test", VideoType.UFS, gp);
}

}
Run Code Online (Sandbox Code Playgroud)

我不太确定问题是什么......但最终发生的事情是: 这是一个问题

Hov*_*els 7

请务必在致电setResizable(false) 之前致电pack()或setVisible(true)

  • @mmnumbp:老实说,我不确定为什么这样做很重要; 我只知道它是如何工作的. (2认同)
  • @HovercraftFullOfEels哇,永远不会想到那会是一个问题.每天都有新的东西+1 (2认同)