2016-06-10 88 views
2

我是新来的Java,我想做一个简单的游戏,其中有一个简单的网格(蛇和迷宫之间的东西)的正方形。正方形的数量不会改变,只有它们的颜色。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);'应该在添加所有组件后完成。 –

+0

“Canvas是一个AWT组件。您应该使用JPanel来代替”:why? – gpasch

回答

3

评论这两行

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

并改变涂料的方法如下。

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

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