2D-Grafik Zeichnen außerhalb der "paintComponent"-Methode?

equin

Aktives Mitglied
Hallo,

kann mir jemand sagen, wie ich außerhalb der "paintComponent"-Methode auf einem JPanel zeichnen kann? Außerhalb dieser Methode ist das "Graphics g" Objekt ja nicht vorhanden, mit dem gezeichnet wird. Folgender Versuch, in der "test" Methode etwas zu zeichnen gibt mir eine Nullpointer-Exception:

Java:
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;


public class PaintTest extends JPanel{

	Graphics g;
	
	public void paintComponent(Graphics g){
		this.g = g;
		g.setColor(Color.BLUE);
		g.drawRect(1, 1, 30, 30);
	}
	
	
	public void test(){
		g.drawRect(40, 40, 100, 100);
	}
}

Was mache ich falsch?

Viele Grüße
equin
 
test wird wahrscheinlihc vor paintComponent aufgerufen... wobei du das selber nicht aufrufen solltest... du kannst in paintComponent test aufrufen und g mitgeben als parameter
 
Ich will diese Klasse aber von "außen" also nicht aus "paintComponent" heraus aufrufen... um zum beispiel nachträglich noch etwas einzuzeichnen...

Und ich denke nicht, dass test() vor paintCompontent aufgerufen wird. Hier noch das zugrhörige JFrame:
Java:
import javax.swing.JFrame;


public class PaintTestFrame extends JFrame{
	PaintTest pt;
	public PaintTestFrame(){
		this.setVisible(true);
		this.setSize(399, 300);
		
		pt = new PaintTest();
		this.add(pt);
	}
	
	public static void main(String[] args) {
		PaintTestFrame ptf = new PaintTestFrame();
		ptf.pt.test();
	}
}
 
setVisible(true) auf JFrame ruft man erst auf wenn das Layout komplett steht.

Du musst aus der paintComponent() heraus zeichnen (zumal das vermutlich dauerhaft erhalten bleiben soll) Du könntest in der test() ein Flag setzen oder Objekt erzeugen und mit repaint() ein Neuzeichnen der Komponente anfordern, in der paintComponent wird dann das Flag bzw. Objekt ausgewertet.
 
setVisible(true);
führt nicht direkt zum Zeichnen, anderenfalls wäre dein setSize() +add(Compoent) DANACH bereits deplaziert,
sollte aber so oder so vor setVisible(true); denn es ist ungewiss, wann genau nebenläufig gezeichnet wird

sieh es ein, im einfachen Falle sollte man nur in paintComponent() malen,
alle anderen Methoden dürften nur Klassenattribute ändern, repaint() aufrufen, so dass das nächste paintComponent() mit den richtigen gespeicherten Infos alles korrekt malt

schau dir Tutorials/ Lehrbücher zur Swing 2D-Grafik an, z.B.
http://www.java-forum.org/spiele-multimedia-programmierung/6529-tutorials.html
 
Alles, was auf den Bildschirm gezeichnet wird, muss von der paintComponent-Methode aus gezeichnet werden.

(Punkt).

Wenn du nachträglich etwas dazuzeichnen willst, musst du entweder...
1. Dieses "etwas" als Objekt in die Zeichnende KLasse reinlegen
Java:
class PaintPanel extends JPanel
{
    private Object etwas; // set-Methode hierfür dazudenken
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        if (etwas != null) zeichne(g, etwas);
    }
oder
2. dieses "etwas" in ein Bild (BufferedImage) reinmalen, und in der paintComponent dann dieses Bild malen.
 

Zurück
Oben