编程入门:用Java画一个象棋棋盘
Java图形界面入门手把手教你画一个中国象棋棋盘附完整代码先放效果图一、准备工作新建窗体和所有Swing程序一样第一步是创建一个JFrame窗口。我们新建一个类GoBangUI在showUI()方法中设置窗体的基本属性packagexiang_qi;importjavax.swing.*;importjava.awt.*;publicclassGoBangUI{publicvoidshowUI(){JFramejfnewJFrame();jf.setTitle(象棋);// 设置标题jf.setSize(450,500);// 设置大小宽450高500jf.setLocation(500,200);// 设置窗口在屏幕上的位置jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 关闭按钮退出程序jf.setVisible(true);// 让窗口显示出来}publicstaticvoidmain(String[]args){GoBangUIuinewGoBangUI();ui.showUI();}}此时运行你会看到一个空白的灰色窗口接下来我们要在上面画棋盘。二、绘制棋盘的步骤我们需要在窗体的“画布”上做四件事画线、填充底色、写字、贴背景图片。1. 画线drawLinedrawLine(x1, y1, x2, y2)方法用于画一条从(x1, y1)到(x2, y2)的线段。我们先定义几个常量方便后续计算X 50棋盘最左边那条线的 X 坐标Y 75棋盘最上边那条线的 Y 坐标SIZE 40每个格子的大小像素ROW 10行数中国象棋是10行COL 9列数中国象棋是9列画横线10行每行一条横线for(inti0;iROW;i){g.drawLine(X,Yi*SIZE,X(COL-1)*SIZE,Yi*SIZE);}画竖线9列但中间有“楚河汉界”断开所以分为上下两段for(inti0;iCOL;i){if(i0||iCOL-1){// 最左边和最右边的竖线要画通到底g.drawLine(Xi*SIZE,Y,Xi*SIZE,Y(ROW-1)*SIZE);}else{// 中间的竖线只画上半部分到第4行和下半部分从第5行开始g.drawLine(Xi*SIZE,Y,Xi*SIZE,Y4*SIZE);g.drawLine(Xi*SIZE,Y5*SIZE,Xi*SIZE,Y(ROW-1)*SIZE);}}画斜线两个“九宫格”的斜线// 上方九宫格g.drawLine(X3*SIZE,Y,X5*SIZE,Y2*SIZE);g.drawLine(X5*SIZE,Y,X3*SIZE,Y2*SIZE);// 下方九宫格g.drawLine(X3*SIZE,Y9*SIZE,X5*SIZE,Y7*SIZE);g.drawLine(X5*SIZE,Y9*SIZE,X3*SIZE,Y7*SIZE);2. 填充底色fillRect为了让棋盘看起来更真实我们先用一个矩形铺上木色背景。fillRect(x, y, width, height)会画一个以(x, y)为左上角、指定宽高的实心矩形。ColorcolornewColor(202,141,20);// 木黄色RGBg.setColor(color);g.fillRect(X-SIZE/2,Y-SIZE/2,(COL-1)*SIZESIZE,(ROW-1)*SIZESIZE);g.setColor(Color.BLACK);// 画线前改回黑色小技巧在 IntelliJ IDEA 中new Color(r, g, b)的括号里可以直接点击颜色预览帮你肉眼选色非常方便。3. 写字drawString中国象棋棋盘中央需要写“楚河”和“汉界”并且“汉界”正立“楚河”倒置让对阵双方各看各的。drawString(text, x, y)的(x, y)是文字左下角的位置基线。若字体大小为负数文字就会上下颠倒。// 写“汉界”正立Stringtext汉 界;FontfontnewFont(篆体,Font.BOLD,30);g.setFont(font);g.drawString(text,90,265);// 写“楚河”倒置Stringtext2楚 河;Fontfont2newFont(篆体,Font.BOLD,-30);// 负字号实现翻转g.setFont(font2);g.drawString(text2,330,245);注意负字号翻转并非所有系统都稳定更标准的方法是使用Graphics2D旋转但作为入门教学此技巧简洁直观。4. 贴入背景图片drawImage我们还可以在窗体的顶部或背景加上一张图片例如棋盘的木质纹理或装饰图。ImageIconimgnewImageIcon(C:\\Users\\chenjiaqin\\Desktop\\download.png);g.drawImage(img.getImage(),0,40,800,800,null);drawImage的参数依次为图片对象、左上角 X、左上角 Y、宽度、高度、图像观察者通常写null即可。三、一个问题线条会消失按照上面的代码如果直接在showUI()方法里用getGraphics()获取画笔并画图当你拖动窗口边缘改变大小、最小化再还原、或者被其他窗口遮挡后再显示你画的线条、文字和图片都会消失只剩下灰色的背景。为什么会这样因为 Java Swing 的窗口在每次需要重绘时比如上述事件系统会自动调用paint(Graphics g)方法来刷新界面。如果你没有重写paint默认的paint只会清空画布并画一个灰色背景你之前用getGraphics画上去的内容就像用粉笔写在黑板上被彻底擦除了。怎么办解决方法就是重写paint方法。我们把所有绘图代码都放在paint方法里这样每次系统要求重绘时都会自动执行我们的画图逻辑图形就会“永久”保留。四、正确的做法继承 JFrame 并重写 paint新建一个类MyFrame继承JFrame并重写paint方法packagexiang_qi;importjavax.swing.*;importjava.awt.*;publicclassMyFrameextendsJFrame{// 背景图片ImageIconimgnewImageIcon(C:\\Users\\chenjiaqin\\Desktop\\download.png);// 重写 paint 方法publicvoidpaint(Graphicsg){// 必须保留调用父类的 paint完成清空、绘制边框等基础工作super.paint(g);System.out.println(窗体刷新);// 可以观察每次重绘的时机// 画背景图片g.drawImage(img.getImage(),0,40,800,800,null);// 定义棋盘参数intX50,Y75,SIZE40,ROW10,COL9;// 填充木色背景ColorcolornewColor(202,141,20);g.setColor(color);g.fillRect(X-SIZE/2,Y-SIZE/2,(COL-1)*SIZESIZE,(ROW-1)*SIZESIZE);g.setColor(Color.BLACK);// 画横线for(inti0;iROW;i){g.drawLine(X,Yi*SIZE,X(COL-1)*SIZE,Yi*SIZE);}// 画竖线断开楚河汉界for(inti0;iCOL;i){if(i0||iCOL-1){g.drawLine(Xi*SIZE,Y,Xi*SIZE,Y(ROW-1)*SIZE);}else{g.drawLine(Xi*SIZE,Y,Xi*SIZE,Y4*SIZE);g.drawLine(Xi*SIZE,Y5*SIZE,Xi*SIZE,Y(ROW-1)*SIZE);}}// 画九宫格斜线g.drawLine(X3*SIZE,Y,X5*SIZE,Y2*SIZE);g.drawLine(X5*SIZE,Y,X3*SIZE,Y2*SIZE);g.drawLine(X3*SIZE,Y9*SIZE,X5*SIZE,Y7*SIZE);g.drawLine(X5*SIZE,Y9*SIZE,X3*SIZE,Y7*SIZE);// 写“汉界”正Stringtext汉 界;FontfontnewFont(篆体,Font.BOLD,30);g.setFont(font);g.drawString(text,90,265);// 写“楚河”倒Stringtext2楚 河;Fontfont2newFont(篆体,Font.BOLD,-30);g.setFont(font2);g.drawString(text2,330,245);}}现在窗口的绘图逻辑被“固化”在paint中无论怎么刷新棋盘都会稳稳地显示出来。五、主程序启动类修改GoBangUI让它创建MyFrame实例并显示窗口。packagexiang_qi;importjavax.swing.*;importjava.awt.*;publicclassGoBangUI{publicvoidshowUI(){MyFramejfnewMyFrame();// 使用我们自己的 JFrame 子类jf.setTitle(象棋);jf.setSize(450,500);jf.setLocation(500,200);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.setVisible(true);// 注意这里的 for 循环和 getGraphics() 仅为演示说明实际可删去for(inti0;i100000;i){System.out.println(hello);}// Graphics g jf.getGraphics(); // 此方法画图会消失不推荐使用}publicstaticvoidmain(String[]args){GoBangUIuinewGoBangUI();ui.showUI();}}六、关于for循环你在某些教材或视频中可能会看到这样的代码for(inti0;i100000;i){System.out.println(hello);}Graphicsgjf.getGraphics();// 然后用 g 画图...这个循环有什么用它是用来强行拖延时间的。因为setVisible(true)后窗口的初始化包括绘制并不是立刻完成的主线程会继续向下执行。如果马上调用getGraphics()很可能获取到的画笔是null或者绘图环境未就绪导致画不出来。用这个循环打印 10 万次“hello”让主线程“卡”一会儿等窗口完全显示后再获取画笔就能成功。但是这种做法会产生一些问题。它让程序启动变慢控制台刷出大量无用信息。即使获取到画笔画出来的图还是会在刷新时消失因为没有重写paint。正确的做法就是第 4 节讲的那样永远把绘图代码放在paint方法里既不需要延时循环也不需要手动getGraphics。结束~

相关新闻

释放数GB空间!Windows驱动存储清理终极解决方案

释放数GB空间!Windows驱动存储清理终极解决方案

释放数GB空间!Windows驱动存储清理终极解决方案 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否发现Windows系统盘空间总是莫名其妙地减少?即使清理了临时…

2026/8/1 11:29:05 阅读更多 →
车内视角拍摄路面标线褪色数据集4083张VOC+YOLO格式

车内视角拍摄路面标线褪色数据集4083张VOC+YOLO格式

车内视角拍摄路面标线褪色数据集4083张VOCYOLO格式数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4083 标注数量(xml文件个数):…

2026/8/1 11:29:05 阅读更多 →
水下渔网破洞和拦截鱼草检测数据集2017张VOC+YOLO格式

水下渔网破洞和拦截鱼草检测数据集2017张VOC+YOLO格式

水下渔网破洞和拦截鱼草检测数据集2017张VOCYOLO格式数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2017 标注数量(xml文件个数)&#xff1…

2026/8/1 11:29:04 阅读更多 →

最新新闻

Jetson边缘计算实战:基于TensorRT优化的实时语音识别与字幕生成

Jetson边缘计算实战:基于TensorRT优化的实时语音识别与字幕生成

1. 项目缘起:为什么要在Jetson上做语音字幕生成?最近在折腾一个边缘计算项目,需要把会议或直播的实时音频流,转换成文字字幕,直接叠加到视频流里。一开始想着用云端API,比如调用大厂的语音识别服务&#xf…

2026/8/1 12:24:23 阅读更多 →
高管凌晨三点要的洞察,AI在117秒内交付:高并发问卷流式分析架构设计(含Prometheus监控看板与SLA保障协议)

高管凌晨三点要的洞察,AI在117秒内交付:高并发问卷流式分析架构设计(含Prometheus监控看板与SLA保障协议)

更多请点击: https://intelliparadigm.com 第一章:高管凌晨三点要的洞察,AI在117秒内交付:高并发问卷流式分析架构设计(含Prometheus监控看板与SLA保障协议) 当业务部门在凌晨三点提交“全量用户NPS趋势细…

2026/8/1 12:24:23 阅读更多 →
Python模块:内置模块collections数据结构扩展

Python模块:内置模块collections数据结构扩展

Python模块:内置模块collections数据结构扩展一、开篇:标准容器的升级版 Python内置的list、dict、tuple、set已经很强大,但有时你需要更专业的工具。collections模块提供了这些"高级容器"——namedtuple让元组有名字,d…

2026/8/1 12:24:23 阅读更多 →
AXI协议BURST机制深度解析:从原理到实战的性能优化指南

AXI协议BURST机制深度解析:从原理到实战的性能优化指南

1. 项目概述:为什么BURST是AXI协议的灵魂在数字芯片设计,尤其是SoC(片上系统)互联领域,AXI(Advanced eXtensible Interface)协议是当之无愧的“顶流”。无论是连接处理器核心与高速缓存&#xf…

2026/8/1 12:24:23 阅读更多 →
如何快速批量重命名阿里云盘文件:终极免费工具指南

如何快速批量重命名阿里云盘文件:终极免费工具指南

如何快速批量重命名阿里云盘文件:终极免费工具指南 【免费下载链接】aliyundrive-batch-rename 阿里云盘网页端批量重命名的油猴脚本 项目地址: https://gitcode.com/gh_mirrors/al/aliyundrive-batch-rename 还在为阿里云盘里杂乱无章的文件名而烦恼吗&…

2026/8/1 12:24:23 阅读更多 →
基于LCU API的模块化自动化框架:League Akari架构解析与深度定制指南

基于LCU API的模块化自动化框架:League Akari架构解析与深度定制指南

基于LCU API的模块化自动化框架:League Akari架构解析与深度定制指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari…

2026/8/1 12:23:23 阅读更多 →

日新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/31 1:03:03 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/8/1 5:19:34 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/8/1 10:33:33 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →