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

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工具来运行:

  1. 把代码保存为checkers.java
  2. 编译代码:javac checkers.java
  3. 创建一个HTML文件(比如checkers.html),内容如下:
<applet code="checkers.class" width="800" height="700"></applet>
  1. 运行命令:appletviewer checkers.html

这样就能看到两个不同位置、不同大小的棋盘啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:17:43