开发者社区> 问答> 正文

JButton正在创建,未出现在Jpanel上,但仍占据面板的空间

我知道这类问题过去已得到部分回答,但由于类似职位中的回答都无法满足我的需求,因此我的情况似乎是一个例外。

我正在使用swing和java创建一个益智游戏。

我的程序从“ IntroMenu”开始,然后通过按钮打开“ MainMenu”,其中的功能为:“开始游戏”,“暂停游戏”。

当按下“开始游戏”时,将打开一个新的GameWindow,在其中实例化我的“ GameBoard”。

GameBoard类如下。(部分代码),因为这是问题所在(测试后得出此结论)。

public void gameBoardFill() {

        List<String> flag = Arrays.asList("OrthogParalilogramo", "Tetragono", "Trigono", "Kiklos", "Romvos", "Joker"); //List containing all the posible types of Tiles
        int ctr = -1; //keeping track of the index value of 'flag' array. Avoiding 'OutOfBound Exception'.

        //For every line in the GameBoard
        for (int i = 0; i < rows; i++) {

            /**
             * Counter increments by 2 cause we need pairs of Tiles. "1" AND "2"
             * is a reference to the kind of graphics to be drawn on the Tile,
             * we have 2 different styles.
             */
            for (int j = 0; j < cols; j += 2) {
                ctr++;

                switch (flag.get(ctr)) {
                    case "OrthogParalilogramo":
                        board.get(i).add(j, new OrthogParalilogramo(i, j, "1"));
                        board.get(i).add(j + 1, new OrthogParalilogramo(i, j + 1, "2"));
                        break;
                    case "Tetragono":
                        board.get(i).add(j, new Tetragono(i, j, "1"));
                        board.get(i).add(j + 1, new Tetragono(i, j + 1, "2"));
                        break;
                    case "Trigono":
                        board.get(i).add(j, new Trigono(i, j, "1"));
                        board.get(i).add(j + 1, new Trigono(i, j + 1, "2"));
                        break;
                    case "Kiklos":
                        board.get(i).add(j, new Kiklos(i, j, "1"));
                        board.get(i).add(j + 1, new Kiklos(i, j + 1, "2"));
                        break;
                    case "Romvos":
                        board.get(i).add(j, new Romvos(i, j, "1"));
                        board.get(i).add(j + 1, new Romvos(i, j + 1, "2"));
                        break;
                    case "Joker":
                        board.get(i).add(j, new Joker(i, j, "1"));
                        board.get(i).add(j + 1, new Joker(i, j + 1, "2"));
                        break;
                    default:
                        System.out.println("Error filling all cells");
                        break;
                }
                board.get(i).get(j).setAlignmentX(20 * (i % rows)); //X,Y Allignment
                board.get(i).get(j).setAlignmentY(20 * (i / rows));

                board.get(i).get(j + 1).setAlignmentX(20 * (i % rows));
                board.get(i).get(j + 1).setAlignmentY(20 * (i / rows));

                GameWindow.root.add(board.get(i).get(j)); // adding the buttons to Jpanel of GameWindow
                GameWindow.root.add(board.get(i).get(j + 1));

                if (ctr == flag.size() - 1) { //keeps the ctr in the proper limits so we dont get nullException
                    ctr = 0;
                }
                //TEST System.out.println(board.get(i).get(j));
            }
        }
    }

在通过静态Jpanel变量(GameWindow类的拥有者)之后,通过将按钮逐个添加到板上,还设置了一些对齐方式,从而成功地在板上填充了按钮。

问题是在我的GameWindow中什么都没有出现,一切都是白色的。

经过一些测试(将jpanel涂成红色)作为背景,我发现在用按钮填充板阵列之后,jpanel变成空白白色,并且“ setAlignment”和“ add to Jpanel”对此没有影响。

这是GameWindow代码:

public class GameWindow {

private final JFrame frame;
private JMenuBar menuBar;
public static JPanel root; //bad programming but works for testing atm.

//Constructor
public GameWindow() {
    frame = new JFrame();
    frame.setTitle("GameWindow");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setResizable(false);
    //menu generate method
    generateMenu();
    frame.setJMenuBar(menuBar);

    //pane with null layout
    root = new JPanel();
    root.setPreferredSize(new Dimension(800, 600));
    root.setBackground(Color.red); //test
    root.setLayout(new GridLayout());
    frame.add(root);
    frame.pack();
    frame.setVisible(true);

}

//method for generate menu
public void generateMenu() {
    menuBar = new JMenuBar();

    JMenu file = new JMenu("File");
    JMenu tools = new JMenu("Tools");
    JMenu help = new JMenu("Help");

    JMenuItem open = new JMenuItem("Open   ");
    JMenuItem save = new JMenuItem("Save   ");
    JMenuItem exit = new JMenuItem("Exit   ");
    JMenuItem preferences = new JMenuItem("Preferences   ");
    JMenuItem about = new JMenuItem("About   ");

    file.add(open);
    file.add(save);
    file.addSeparator();
    file.add(exit);
    tools.add(preferences);
    help.add(about);

    menuBar.add(file);
    menuBar.add(tools);
    menuBar.add(help);
}

/**
 *
 */
public void GameView() {
    GameBoard GB = GameBoard.getInstance();
    GB.PlayGame();
}

} 我知道,如果没有完整的项目代码,很难理解可能的错误,但是由于有很多类,因此我不确定如何构造这个问题。

如果需要,很高兴分享任何更多信息。不讨厌。圣诞快乐 ;)

展开
收起
几许相思几点泪 2019-12-24 21:14:29 675 0
1 条回答
写回答
取消 提交回答
  • 没有设置布局,就是 绝对定位布局。

    那么里面的控件需要设置 位置大小,才能正确显示的。

    不过一般不推荐用绝对定位布局模式。

    2019-12-25 14:33:43
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载