2013-05-19 90 views
0

我在這裏傻眼了。我有我添加到父JPanel(的GamePanel)如下一個JPanel(defBoardPanel):JPanel在添加到父項時沒有出現JPanel

public GamePanel(SetupBoard sb) { 
    this.setLayout(new BorderLayout()); 
    // this.setBackground(Color.yellow); 
    JPanel defBoardPanel = new JPanel(); 
    defBoardPanel.setBackground(Color.yellow); 

    for (int r = 0; r < sb.boardSize; r++){ 
     for (int c = 0; c < sb.boardSize; c++){ 
      Cell c = new Cell(r, c);  
      c.label.setOpaque(true); 
      if (sb.getCell(r, c).status == sb.getCell(r,c).status.occupied){ 
       c.label.setBackground(Color.black); 
       System.out.println("LABEL IS OCCUPIED"); 
      } 
      else { 
       c.label.setBackground(Color.white); 
      } 
      defBoardPanel.add(c.label); 
     } 
    } 

    defBoardPanel.revalidate(); 
    defBoardPanel.setVisible(true); 
    this.add(defBoardPanel, BorderLayout.WEST); 
    this.revalidate(); 
    this.setVisible(true); 

此面板是要被添加到一個JFrame(大型機),其如下所示。當應用程序啓動時,JFrame會顯示一種不同類型的面板(SetupBoard),用戶通過它設置他們的遊戲板。當他們點擊「接受」時,調用MainFrame的StartGame()方法,它應該顯示上面的JPanel。

public MainFrame() { 
    this.setLayout(new BorderLayout()); 
    this.setSize(500, 500); 

    SetupBoard sb = new SetupBoard(10, this); 
    this.setContentPane(sb); 

} 

    void startGame(SetupBoard sb){ 
     GamePanel gp = new GamePanel(sb); 
     this.setContentPane(gp); 
     this.revalidate(); 

} 

我的問題是,子面板(defBoardPanel)沒有顯示。 GamePanel本身顯示(我已經使用setBackground(Color.yellow)方法驗證過了),但不是已添加到它的面板。

我在這裏忽略了什麼愚蠢的錯誤?

編輯:startGame()被從SetupBoard類中調用:

void startGame(){ 
    mf.startGame(this); 
} 

其中MF是創建該SetupBoard實例的大型機參考。 GamePanel顯示的事實證明這是被正確調用的。

+1

你真的調用'startGame'嗎?爲了更好地幫助發佈[SSCCE](http://sscce.org/) – Reimeus

+0

@Reimeus是的,請參閱編輯。此外,我試圖創建一個SSCCE,但我無法複製該行爲。 – drewmoore

+0

您似乎沒有在defBoardPanel中放置任何組件,也沒有給它一個特定的大小。 defBoardPanel可能有零大小,所以你沒有看到它。嘗試設置面板的大小,然後調用JFrame對象上的pack(),以根據面板和組件大小重新定位所有內容。 – Bobulous

回答

1

似乎工作正常,如果我修剪我沒有的代碼。很可能這個問題來自於你沒有向我們展示的東西。因此,生產SSCCE將對您大有裨益。同時,你可以隨時利用(找到你的代碼的差異)以下的一個,這是高度源於你的(我填補一些空白,因爲我可以):

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.GridLayout; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class GamePanel extends JPanel { 
    private static final int COLS = 10; 
    private static final int ROWS = 10; 

    public GamePanel() { 
     this.setLayout(new BorderLayout()); 
     // this.setBackground(Color.yellow); 
     JPanel defBoardPanel = new JPanel(new GridLayout(ROWS, COLS)); 
     defBoardPanel.setBackground(Color.yellow); 
     for (int r = 0; r < ROWS; r++) { 
      for (int c = 0; c < COLS; c++) { 
       JLabel label = new JLabel((r + 1) + " " + (c + 1)); 
       label.setOpaque(true); 
       if (Math.random() > 0.5) { 
        label.setBackground(Color.black); 
        label.setForeground(Color.WHITE); 
        System.out.println("LABEL IS OCCUPIED"); 
       } else { 
        label.setBackground(Color.white); 
       } 
       defBoardPanel.add(label); 
      } 
     } 
     this.add(defBoardPanel, BorderLayout.WEST); 
    } 

    public static class MainFrame extends JFrame { 
     public MainFrame() { 
      this.setLayout(new BorderLayout()); 
      this.setSize(500, 500); 
     } 

     void startGame() { 
      GamePanel gp = new GamePanel(); 
      this.setContentPane(gp); 
      pack(); 
      setVisible(true); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       MainFrame mainFrame = new MainFrame(); 
       mainFrame.startGame(); 
      } 
     }); 
    } 
} 
1

此代碼序列替換GamePanel它已被添加到MainFrame

public MainFrame() { 
    this.setLayout(new BorderLayout()); 
    this.setSize(500, 500); 

    SetupBoard sb = new SetupBoard(10, this); // invokes startGame 
    this.setContentPane(sb); <----- GamePanel replaced here 
} 

void startGame(SetupBoard sb) { 
    GamePanel gp = new GamePanel(sb); 
    this.setContentPane(gp); 
    this.revalidate(); 
} 
+0

+1在MainFrame構造函數中對'setContentPane'的調用將覆蓋'startGame'所做的調用(如果在'SetupBoard'構造函數中調用了'startGame')。正如我在說的 - 「最有可能的問題來自於你沒有向我們展示的東西。」_ ;-) –

+0

調用'startGame()'之後,在構造函數中調用的那個調用不會被調用。 startGame()在已存在的MainFrame實例上被調用。另外,這不會導致SetupBoard再次顯示?不是,GamePanel被顯示,而不是我添加到它的面板。 – drewmoore

+0

@GuillaumePolet:在SetupBoard構造函數中不調用'startGame()',它通過在SetupBoard上的按鈕上的'ActionListener'中調用的單獨方法調用。 – drewmoore