2013-05-16 57 views
3

我有一個帶有BorderLayout的JFrame類,它包含另一個擴展JPanel的類(ScorePanel)。這是JFrame類的相關代碼,這是一個未由​​設置ScorePanels的構造函數調用的方法。 gPanel是主要的遊戲面板,但不要擔心:JPanels繼續出現,不管我設置了多大的尺寸

public void initialize() { //called by controller at the end 
    if (Controller.DEBUG) System.out.println("View initialized"); 
    JPanel scores = new JPanel(); 
    scores.setSize(1000,200); 
    scores.setBackground(Color.BLACK); 
    ScorePanel score1 = new ScorePanel("Volume", 1); 
    ScorePanel score2 = new ScorePanel("Pitch", 2); 
    scores.add(score1); scores.add(score2); 
    scores.setVisible(true); 
    scores.validate(); 
    this.add(scores, BorderLayout.SOUTH); 
    this.add(gpanel, BorderLayout.CENTER); //main game panel 
    this.validate(); 
    this.setVisible(true); 
    this.repaint(); 
} 

這是ScorePanel的相關代碼:

private int score; //this current score 
private String name; //this name 
private int player; //this player 

public ScorePanel(String n, int p){ //a JPanel that shows the player's name and score 
    super(); 
    name = n; 
    score = 0; 
    player = p; 
    setBackground(Color.WHITE); 
    setSize(450,150); 
    setVisible(true); 
} 

我此之前已經想通,但我可以不記得要做什麼。當我運行這個時會發生什麼,我看到一些白色方塊,ScorePanel應該是大型的。

下面是截圖。我希望我的問題和代碼很明確。

Unfinished pong game

回答

5

JPanel使用FlowLayout默認,尊重其子組件的優選的尺寸。目前的首選尺寸可能是0 x 0。覆蓋getPreferredSize來設置它。

ScorePanel score1 = new ScorePanel("Volume", 1) { 
    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(150, 100); 
    }; 
}; 

不要對組件使用setSize。而是如上設置首選尺寸,並確保調用JFrame#pack

+0

哇,謝謝。完美工作。 – sudo