Supportnet / Forum / Anwendungen(Java,C++...)
Java: Objekte zeichnen in Canvas
Frage
Hallo.
Soll für die FH als Aufgabe ein Programm erstellen, das verschiedene Objekte in ein Frame zeichnet. Unter anderem soll eine Canvas rein, auf die dann auch wieder gezeichnet werden soll.
Jetzt hab ich gelesen dass man ne Canvas nicht direkt bekritzeln kann, sondern dass das über eine weitere Funktion angestoßen werden muss. Diese habe ich unter zeichneAufCanvas() geschrieben. Die Compilierung läuft durch, allerdings gibt mir die Eingabeaufforderung eine NullPointerException aus und das Frame wird nicht erstellt. Hier der Quelltext:
import java.awt.* ;
public class MyFrame extends Frame {
Canvas c = new Canvas();
public MyFrame() {
super("MyFrame") ;
setLayout (new FlowLayout ());
c.setBackground(Color.yellow);
c.setBounds(0,0,100,300);
zeichneAufCanvas();
add(c);
add (new Button("Button"));
add (new TextField());
add (new Choice());
}
public void zeichneAufCanvas(){
Graphics g = c.getGraphics();
g.drawString("Canvas",10,20);
}
public static void main(String[] args) {
MyFrame ef = new MyFrame() ;
ef.setSize(300, 300) ;
ef.setVisible(true) ;
}
Antwort 1 von semi
getGraphics() liefert null, solange das Ding noch nicht sichtbar ist.
Antwort 2 von mac241
Ähm danke, und wie schaff ich es dass es erst nach Initialisierung aufgerufen wird?
Antwort 3 von mr_x_hacker
Du könntest das setVisible(true) in den Konstruktor schreiben, oder zeichneAufCanvas() erst nach der Initialisierung und dem setVisible() in der main() aufrufen...
Ciao Sascha
Ciao Sascha
Antwort 4 von semi
...oder auch die pain-Methode überschreiben.
import java.awt.* ;
public class MyFrame extends Frame
{
class MyCanvas extends Canvas
{
public void paint(Graphics g)
{
super.paint(g);
g.drawString("Canvas",10,20);
}
}
Canvas c = new MyCanvas();
public MyFrame()
{
super("MyFrame") ;
setLayout (new FlowLayout ());
c.setBackground(Color.yellow);
c.setBounds(0,0,100,300);
add(c);
add (new Button("Button"));
}
public static void main(String[] args)
{
MyFrame ef = new MyFrame() ;
ef.setSize(300, 300) ;
ef.setVisible(true) ;
}
}
Antwort 5 von mac241
Thanks, das hat mir geholfen.