2013-05-03 21 views
1

我正在寫一個蛇遊戲,但有一個小問題。有時候,面板和框架之間有一點距離。我真的不知道可能是什麼問題,因爲它看起來很不規律。擺動 - JFrame有時比預先設定的尺寸大

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 

}

+0

那麼......首先,您沒有正確使用'CardLayout'。 – 2013-05-03 21:41:29

+0

恩,那麼正確的用途是什麼? – 2013-05-03 21:44:56

+0

'有時候,面板和框架之間有一點距離。 ' - 確保創建GUI的代碼在EDT上執行。另外,不要使用靜態變量。 – camickr 2013-05-03 21:45:47

回答

0

好吧,我知道這是做噁心的方式。但在JFrame isResizable(false) sizing issue這個問題上說:「你可以在致電JFrame#setResizable後通過致電JFrame#pack重置它」。所以我想,爲什麼不重置它兩次?!

代碼:

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()當寬度比我的首選尺寸更大,似乎解決問題。

2

嘗試調用setResizable後,您撥打pack

出於某種原因,在做它的其他方式似乎增加約10 20個像素的寬度和高度。

如果還是不行,請致電setResizable後的幀已經被可見

+0

我剛剛嘗試過調用'setResizable'的每個組合 - 它們都不起作用。然而,當完全不使用setResizable時,它完美地工作。 – 2013-05-03 22:58:35

1

我今天遇到同樣的問題。經過一些Google搜索後,我找不到任何好的答案。庫巴給出了一個很好的提示,問題終於得到解決。我猜這個問題是由setResizable(false)函數的延遲引起的,因此偶爾會發生。我的解決方案是在調用setResizable之後添加一個short hold。

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