0

私はここで唖然とします。次のようJPanelに、親JPanel(GamePanel) に追加する (defBoardPanel) があります。

  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 (MainFrame) に追加されます。アプリケーションが起動されると、JFrame は別のタイプのパネル (SetupBoard) を表示し、ユーザーはそれを使用してゲーム ボードをセットアップします。「同意する」をクリックすると、MainFrame の StartGame() メソッドが呼び出され、上の JPanels が表示されます。

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 インスタンスを作成した MainFrame への参照です。GamePanel がまったく表示されるという事実は、これが正しく呼び出されていることを確認します。

4

2 に答える 2

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();
}
于 2013-05-19T22:22:39.793 に答える