添加到父JPanel时不显示JPanel

  • 本文关键字:JPanel 显示 添加 java swing
  • 更新时间 :
  • 英文 :


我目瞪口呆。我有一个JPanel (defBoardPanel),我添加到父JPanel (GamePanel)如下:

  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显示不同类型的Panel (SetupBoard),用户可以使用该Panel设置他们的游戏板。当他们点击"接受"时,主机的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实例的MainFrame的引用。GamePanel显示的事实证实了这是正确调用的。

似乎工作好,如果我修剪代码,我没有。问题很可能来自于你没有给我们看的东西。因此,制作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();
            }
        });
    }
}

此代码序列替换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();
}

最新更新