gpt4 book ai didi

java - 添加到父 JPanel 时 JPanel 不出现

转载 作者:行者123 更新时间:2023-12-02 07:01:14 25 4
gpt4 key购买 nike

看到这里我就傻眼了。我有一个 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 显示不同类型的面板 (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 实例的 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();
}
});
}
}

关于java - 添加到父 JPanel 时 JPanel 不出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16639754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com