Swing - JFrame有时比首选大小更大

时间:2013-05-03 21:37:50

标签: java swing jframe jpanel

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

The gap is on the right and bottom. This time, it is displayed correctly. 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

}

3 个答案:

答案 0 :(得分:2)

请在致电setResizable

后致电pack

出于某种原因,从另一个方面来看,似乎在宽度和高度上增加了大约10-20个像素。

如果不起作用,请在框架可见后调用setResizable

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

好的,我知道这是一种令人作呕的方法。但在问题JFrame isResizable(false) sizing issue中说:“您可以在调用JFrame#pack”后通过电话JFrame#setResizable重置它。所以我想,为什么不重置两次?!

代码:

private static void createAndShowGUI() {

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

  frame.pack();

  if(frame.getContentPane().getWidth() > 600){
        frame.pack();
  }

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

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