无法调用“java.awt.Graphics.setColor(java.awt.Color)”,因为“g”为空

问题描述 投票:0回答:1

这是我第一次遇到 GUI,当我一直在学习和搜索时,我一直在尝试做一些练习,但遇到了这个错误。有人可以善意地解释一下为什么会发生这种情况吗?非常感谢。错误是“无法调用“java.awt.Graphics.setColor(java.awt.Color)”,因为“g”为空”

import java.awt.Graphics;
import java.awt.Color;
import java.awt.Canvas;
import javax.swing.JFrame;

public class Circle extends Canvas {

    public Circle() {
        JFrame frame = new JFrame("Circle Exercise");
        Canvas paper = new Canvas();
        frame.setSize(500, 500);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(paper);
    }
    @Override
    public void paint(Graphics g) {
        g.setColor(Color.RED);
        g.drawOval(100, 100, 200, 200);
    }

    public static void main(String[] args) {
        Circle drawing = new Circle();
        drawing.paint(null);
    }

}
java user-interface
1个回答
2
投票
drawing.paint(null); 

删除该声明;不需要。

只要 Swing 确定需要绘制组件,组件就会自动绘制。

但是,您还有其他问题:

  1. 需要在框架可见之前将组件添加到框架中。

  2. 所有组件都应确定自己的首选大小,以便它们可以与布局管理器正确使用。所以你需要重写

    getPreferredSize()
    方法来返回合适的大小。

  3. Canvas 是一个较旧的 AWT 组件。人们通常使用 Swing 组件进行绘画。通常,您会使用

    JPanel
    并覆盖
    paintComponent(...)
    方法。然后,您需要调用
    super.paintComponent(...)
    作为第一个语句,以确保背景被清除。

  4. Swing 组件需要在事件调度线程 (EDT) 上创建。阅读关于 Custom Painting 的 Swing 教程,获取包含上述所有建议的示例,以便为您提供更好的结构化代码。

© www.soinside.com 2019 - 2024. All rights reserved.