Java扫雷游戏按钮生成异常:每次运行随机生成1-81个按钮求助
问题排查:扫雷游戏按钮数量随机显示的原因
核心错误
你代码里的关键问题是在所有UI组件初始化、添加完成前,就调用了frame.setVisible(true)。Swing的组件渲染依赖事件调度线程的布局计算,提前显示窗口会导致布局管理器还未完成所有组件的布局处理,从而出现部分按钮无法正常渲染的随机情况。
修复方案
将frame.setVisible(true)移动到构造方法的最后,确保所有组件都已添加到窗口并完成配置:
修改后的构造方法代码:
public MineSweeper(int width, int height) { this.width = width; this.height = height; // 移除此处的setVisible调用 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(width, height); frame.setResizable(false); frame.setLocationRelativeTo(null); frame.setLayout(new BorderLayout()); JLabel label = new JLabel(); label.setText("Mine Sweeper!"); label.setHorizontalAlignment(JLabel.CENTER); label.setFont(new Font("arial", Font.BOLD, 30)); label.setBackground(Color.gray); label.setForeground(Color.orange); frame.add(BorderLayout.NORTH, textPanel); textPanel.setLayout(new BorderLayout()); textPanel.add(label); textPanel.setBackground(Color.gray); panel = new JPanel(); panel.setLayout(new GridLayout(9, 9, 5, 5)); panel.setBackground(Color.gray); frame.add(BorderLayout.CENTER, panel); for (int r = 0; r < 9; r++) { for (int c = 0; c < 9; c++) { JButton mines = new JButton(""); buttons[r][c] = mines; panel.add(mines); mines.setFocusable(false); mines.setBackground(Color.lightGray); // 此行仅获取组件数量无实际作用,可删除 // panel.getComponentCount(); mines.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { } }); } } // 所有组件配置完成后,再显示窗口 frame.setVisible(true); }
额外优化提示
- 代码中
panel.getComponentCount()仅执行了获取操作,未做后续处理,属于冗余代码,可直接删除。 - 建议设置合适的窗口尺寸(比如
frame.setSize(600, 650)),避免因传入的width/height过小导致按钮被挤压无法完整显示。
内容的提问来源于stack exchange,提问作者Divine Thunderbolt
相关产品推荐
相关产品推荐

