2016-06-10 13 views
2

Ich bin neu in Java und ich möchte ein einfaches Spiel machen, wo es Quadrate in einem einfachen Gitter gibt (etwas zwischen einer Schlange und einem Labyrinth). Die Anzahl der Quadrate ändert sich nicht, nur ihre Farbe.Java: Wie zeichne ich eine Leinwand?

Ich habe bereits die Objekte programmiert, die ich für das Spiel brauche. Jetzt möchte ich das Spiel anzeigen.

Ich weiß, wie ich ein JFrame, ein JPanel und ein JButton erstellen, die ich brauche, aber ich verstehe nicht, wie man in einer Leinwand zeichnet.

ich eine Testklasse gemacht:

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); 
    } 
} 

Als ich dies ausführen, wird ein Fenster erstellt wird, mit der richtigen Titel, Größe und Taste, aber es gibt nichts anderes (keinen grünen Hintergrund, kein rot oder blaues Rechteck), und ein Fehler wird erkannt:

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

Was mache ich falsch? Gibt es eine bessere Möglichkeit, diese Quadrate zu zeichnen?

Danke!

+1

Canvas ist eine AWT-Komponente. Sie sollten stattdessen ein JPanel verwenden: – ControlAltDel

+1

1) 'Graphics g = canvas.getGraphics();' Nebenbei bemerkt, das kommt fast täglich vor, genauso wie der Hinweis, keine AWT-Komponenten in Swing-GUIs zu verwenden. So ziemlich alles, was man in einem 'Canvas' machen kann, kann in' JPanel' (und besser) gemacht werden. 2) 'f.setVisible (true);' sollte durchgeführt werden, nachdem alle Komponenten hinzugefügt wurden. –

+0

"Canvas ist eine AWT-Komponente. Sie sollten stattdessen eine JPanel verwenden": warum ??? – gpasch

Antwort

3

Kommentar diese beiden Linien

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

Und die Farbe Methode wie folgt ändern.

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

Rest ist alles in Ordnung. Hoffe es hilft dir weiter zu kommen.