You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用嵌套for循环创建8x8网格每格为JButton用于奥赛罗(Othello)游戏

Java Swing 双层for循环实现8x8 JButton网格(奥赛罗作业适用)

奥赛罗棋盘正好是8x8规格,用Swing的GridLayout布局管理器配合双层for循环实现效率最高,也方便后续落子逻辑开发,实现逻辑如下:

  • 首先初始化一个JPanel容器,设置布局为new GridLayout(8,8),刚好适配8行8列的网格排布,所有按钮会自动等宽等高填充容器
  • 第一层for循环控制行(取值0到7,对应棋盘行坐标),第二层for循环控制列(取值0到7,对应棋盘列坐标)
  • 每层循环内创建JButton实例,把行、列坐标存到按钮的客户端属性里,后续落子判断可以直接读取坐标,无需额外遍历查找
  • 初始化按钮的大小、边框、背景色(奥赛罗棋盘常规为绿色背景,可通过setBackground(new Color(0,128,0))设置),再添加到提前创建的JPanel容器中即可

完整可运行代码示例

import javax.swing.*;
import java.awt.*;

public class OthelloBoard extends JFrame {
    // 存储所有按钮的二维数组,后续操作棋盘可以直接用索引取对应按钮
    private final JButton[][] boardButtons = new JButton[8][8];

    public OthelloBoard() {
        setTitle("奥赛罗棋盘");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(600,600);
        setLocationRelativeTo(null); // 窗口居中显示

        // 初始化棋盘容器
        JPanel boardPanel = new JPanel(new GridLayout(8,8));
        // 双层for循环创建按钮
        for (int row = 0; row < 8; row++) {
            for (int col = 0; col < 8; col++) {
                JButton button = new JButton();
                // 存储行列坐标,后续落子逻辑直接读取
                button.putClientProperty("row", row);
                button.putClientProperty("col", col);
                // 初始化棋盘样式
                button.setBackground(new Color(34, 139, 34)); // 森林绿,符合奥赛罗棋盘常规配色
                button.setBorder(BorderFactory.createLineBorder(Color.BLACK)); // 格子边框
                // 按钮点击监听器,处理落子逻辑
                button.addActionListener(e -> {
                    JButton source = (JButton) e.getSource();
                    int clickRow = (int) source.getClientProperty("row");
                    int clickCol = (int) source.getClientProperty("col");
                    // 此处可后续添加落子、翻转棋子的业务逻辑
                });
                // 存入二维数组,添加到容器
                boardButtons[row][col] = button;
                boardPanel.add(button);
            }
        }

        add(boardPanel, BorderLayout.CENTER);

        // 初始化奥赛罗开局固定的四个棋子
        boardButtons[3][3].setBackground(Color.WHITE);
        boardButtons[3][4].setBackground(Color.BLACK);
        boardButtons[4][3].setBackground(Color.BLACK);
        boardButtons[4][4].setBackground(Color.WHITE);

        setVisible(true);
    }

    public static void main(String[] args) {
        // Swing组件要求在事件 dispatch 线程初始化,避免渲染异常
        SwingUtilities.invokeLater(OthelloBoard::new);
    }
}

常见实现失败原因排查

  • 布局设置错误:如果未使用GridLayout,而是误用FlowLayout或者空布局,会导致按钮堆叠或者不按网格排列
  • 循环边界写错:如果循环条件写成row <=8或者col <=8,会创建9x9的网格,甚至触发数组越界报错
  • 忘记添加组件:创建完按钮后未调用add方法添加到JPanel或者窗口中,运行后看不到任何组件
  • 可见性设置顺序错误:setVisible(true)要放在所有组件添加完成之后调用,否则组件不会正常渲染

内容的提问来源于stack exchange,提问作者Temi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 07:54:07