Java:如何在画布上绘图?

3
我刚接触Java,想制作一个简单的游戏,在简单的网格中放置方块(类似于贪吃蛇和迷宫的混合物)。方块的数量不会改变,只有它们的颜色会改变。
我已经编写了游戏需要的对象。现在,我想显示游戏。
我知道如何创建一个JFrame、一个JPanel和一个JButton,这是我需要的,但我不明白如何在画布上绘制。
我编写了一个测试类:
import javax.swing.*;
import java.awt.*;

public class Test extends Canvas {
    public static void main (String[] arg) {
        JFrame f=new JFrame();
        f.setTitle("Title");
        f.setSize(400,500);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
        JPanel pan=new JPanel(new FlowLayout());
        pan.add(new JButton("hey"));
        Test canvas=new Test();
        Graphics g=canvas.getGraphics();
        canvas.paint(g);
        pan.add(canvas);
        f.setContentPane(pan);
    }

    public Test() {
        setBackground (Color.green);
        setSize(300,300);
        setVisible(true);
    }

    public void paint(Graphics g) {
        Color c = g.getColor();
        g.setColor(Color.RED);
        g.fillRect(10,10,80,80);
        g.setColor(Color.BLUE);
        g.fillRect(150,50,80,80);
        g.setColor(c);
    }
}

当我运行此代码时,会创建一个窗口,具有正确的标题、大小和按钮,但没有任何其他东西(没有绿色背景、没有红色或蓝色矩形),并且会检测到错误:

Exception in thread "main" java.lang.NullPointerException
    at Test.paint(Test.java:25)
    at Test.main(Test.java:15)

我做错了什么?有更好的方法来绘制这些正方形吗?

谢谢!


1
Canvas是一个AWT组件。你应该使用JPanel代替它。 - ControlAltDel
1
  1. Graphics g=canvas.getGraphics(); 顺便提一下,这个问题几乎每天都会出现,就像不建议在Swing GUI中使用AWT组件一样。几乎任何可以在Canvas中完成的事情都可以在JPanel中完成(而且更好)。
  2. 在添加所有组件后应该执行f.setVisible(true);
- Andrew Thompson
"Canvas是一个AWT组件。你应该使用JPanel代替它": 为什么? - gpasch
1个回答

6

注释这两行代码

 //Graphics g=canvas.getGraphics();
 //canvas.paint(g);

将paint方法更改如下。

 @Override
 public void paint(Graphics g) {
     super.paint(g);

其余都没问题,希望这样能帮助你进步。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接