Java Swing-JFrame有时大于首选大小

Java Swing-JFrame有时大于首选大小,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,我正在写一个蛇的游戏,但是有一个小问题。有时面板和框架之间有一点间隙。我真的不知道是什么问题,因为它看起来如此不规则 SSCCE: public class Game { static JFrame frame = new JFrame("The Snake Game"); static Game game = new Game(); JPanel cards; static JPanel card1 = new JPanel(); private Game() { } publ

我正在写一个蛇的游戏,但是有一个小问题。有时面板和框架之间有一点间隙。我真的不知道是什么问题,因为它看起来如此不规则

SSCCE:

public class Game {

static JFrame frame = new JFrame("The Snake Game");
static Game game = new Game();
JPanel cards;
static JPanel card1 = new JPanel();

private Game() {    
}

public void addComponentToPane(Container pane) {

    // CARD 1

    card1.setLayout(null);
    card1.setPreferredSize(new Dimension(600, 625));        

    CardLayout cl = new CardLayout();        
    cards = new JPanel(cl);
    cards.add(card1);

    pane.add(cards, BorderLayout.CENTER);
}

private static void createAndShowGUI() {

    game.addComponentToPane(frame.getContentPane());
    frame.setResizable(false);      
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frame.pack();

    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

} 

public static void main(String[] args) {

        javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });

} // end of main

}

在调用
pack

出于某种原因,以另一种方式进行操作似乎会使宽度和高度增加约10-20个像素


如果这不起作用,请在框架显示后调用
setresizeable
好的,我知道这是一种令人厌恶的方式。但在问题中说:“您可以在调用
JFrame#setresizeable
之后通过调用
JFrame#pack
重置它。”。所以我想,为什么不重置两次呢

代码:


因此,当宽度大于我的首选大小时,第二次调用方法
pack()
似乎可以解决问题。

我今天遇到了同样的问题。在谷歌搜索了一下之后,我找不到任何好的答案。库巴给了一个很好的暗示,问题终于解决了。我猜这个问题是由setresizeable(false)函数的延迟引起的,因此它偶尔会发生。我的解决方案是在调用SetResizeable后添加一个短保持

setResizable(false);
try {
    Thread.sleep(200);
} catch (InterruptedException e) {
    e.printStackTrace();
}

嗯……首先,您没有正确使用
CardLayout
。嗯,那么正确的用法是什么呢?
有时候面板和框架之间有一点间隙-确保创建GUI的代码在EDT上执行。另外,不要使用静态变量。@camickr-是的,我只是不把它包含在这里以缩短它。:)创建CardLayout的实例:
CardLayout cl=new CardLayout()
setLayout(cl)
方法中传递该实例。添加其他容器(card1,card2),如下所示:
cards.Add(card1,“card1”)。显示所需的
JPanel
cl.show(卡片,“card1”)
(显示card1
JPanel
)。我刚刚尝试了调用
SetResizeable
的每一种组合,但都不起作用。但是,当根本不使用
setresizeable
时,它可以完美地工作。
setResizable(false);
try {
    Thread.sleep(200);
} catch (InterruptedException e) {
    e.printStackTrace();
}