1

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

间隙在右侧和底部。 这一次,它显示正确。 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

}

4

3 回答 3

2

setResizable打电话后尝试打电话pack

出于某种原因,以另一种方式执行似乎会在宽度和高度上增加大约 10-20 像素。

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

于 2013-05-03T22:50:32.847 回答
1

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

setResizable(false);
try {
    Thread.sleep(200);
} catch (InterruptedException e) {
    e.printStackTrace();
}
于 2014-06-23T11:57:26.590 回答
0

好吧,我知道这是一种令人作呕的做法。但是在问题JFrame isResizable(false) 大小问题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()因此,当宽度大于我的首选尺寸时,第二次调用该方法似乎可以解决问题。

于 2013-05-03T23:06:44.160 回答