Java新手求助:非静态方法无法从静态上下文引用,棋盘无输出
解决你的Java棋盘绘制问题
嘿,作为Java新手遇到这个问题太正常了,我来帮你拆解错误原因,再给你修复好的代码!
先说说你遇到的核心错误
error: non-static method drawCheckerboard(int,int,Graphics) cannot be referenced from a static context
这个错误的本质是:静态方法(比如main)不能直接调用非静态方法。非静态方法属于类的实例对象,而静态方法属于类本身——在没有创建类的实例时,非静态方法还“不存在”,自然没法调用。
另外你的代码还有两个隐藏坑:
Graphics myG;只是声明了变量,但完全没初始化,直接传参进去会触发空指针异常- Applet程序的运行逻辑不是靠
main方法,它需要重写paint方法来获取系统提供的Graphics对象进行绘制
修复后的完整代码
我帮你重构了代码,既解决了错误,也实现了两个棋盘的绘制,完全符合Applet的运行规范:
import java.awt.*; import java.applet.*; /** * checkers * @author ///////// * @version 3.7.2018 */ public class checkers extends Applet { // 重写Applet的paint方法,系统会自动传入可用的Graphics对象 @Override public void paint(Graphics g) { // 绘制第一个棋盘:起始坐标(100,100),每个格子边长30px drawCheckerboard(100, 100, 30, g); // 绘制第二个棋盘:起始坐标(120,500),每个格子边长25px drawCheckerboard(120, 500, 25, g); } /** * 绘制棋盘的工具方法 * @param x 棋盘左上角的x坐标 * @param y 棋盘左上角的y坐标 * @param gridSize 每个格子的边长 * @param g 用于绘制的Graphics对象 */ public void drawCheckerboard(int x, int y, int gridSize, Graphics g) { // 标准棋盘是8x8的格子 for (int row = 0; row < 8; row++) { for (int col = 0; col < 8; col++) { // 交替设置格子颜色,实现黑白相间效果 if ((row + col) % 2 == 0) { g.setColor(Color.WHITE); } else { g.setColor(Color.BLACK); } // 计算当前格子的坐标,填充矩形 int currentX = x + col * gridSize; int currentY = y + row * gridSize; g.fillRect(currentX, currentY, gridSize, gridSize); // 给每个格子加灰色边框,让棋盘更清晰 g.setColor(Color.GRAY); g.drawRect(currentX, currentY, gridSize, gridSize); } } } }
怎么运行这个Applet?
你需要用appletviewer工具来运行:
- 把代码保存为
checkers.java - 编译代码:
javac checkers.java - 创建一个HTML文件(比如
checkers.html),内容如下:
<applet code="checkers.class" width="800" height="700"></applet>
- 运行命令:
appletviewer checkers.html
这样就能看到两个不同位置、不同大小的棋盘啦!
内容的提问来源于stack exchange,提问作者IalexM
相关产品推荐
相关产品推荐

