Java:如何在画布中绘制?

Posted

技术标签:

【中文标题】Java:如何在画布中绘制?【英文标题】:Java: How to draw in a canvas? 【发布时间】:2016-10-11 18:52:09 【问题描述】:

我是 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)

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

谢谢!

【问题讨论】:

Canvas 是一个 AWT 组件。您应该改用 JPanel 1) Graphics g=canvas.getGraphics(); 顺便说一句,这几乎每天都会出现,建议不要在 Swing GUI 中使用 AWT 组件。几乎可以在Canvas 中完成的任何事情都可以在JPanel 中完成(甚至更好)。 2) f.setVisible(true); 应该在所有组件添加后完成.. “Canvas 是一个 AWT 组件。你应该使用 JPanel”:为什么??? 【参考方案1】:

评论这两行

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

并且改变paint方法如下。

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

休息一切都好。希望它能帮助你进步。

【讨论】:

以上是关于Java:如何在画布中绘制?的主要内容,如果未能解决你的问题,请参考以下文章

如何让用户在 WPF 中使用画布绘制线条

如何在两个以上的画布中绘制 HTML 和 JS

如何将多个图像绘制到单个画布上?

如何在画布内的文本周围绘制矩形

如何等到在 iframe 中绘制 adobe 动画画布?

如何在 html5 画布中绘制椭圆?