Wer ruft die Methode auf?

  • Themenstarter Themenstarter Chaplin
  • Beginndatum Beginndatum
C

Chaplin

Gast
Hallo,
Ich habe eine ganz grunsätzliche Frage, ich benützte eine Ableitung der Klasse JPanel als Leinwand. Meine Frage bezieht sich nun auf die Methode paintComponent. Der Methode wird nun ein allgemeines Grafikobjekt g übergeben, und alle Methoden werden jetzt über dieses Objekt aufgerufen. Ich denke dies ist soweit noch richtig.

Frage:
Die Methode paintComponent() wird ja gar nie aufgerufen, dennoch erscheint das blaue Quadrat. Warum ist dies so? Bzw. von wem wird die Methode paintComponent() aufgerufen?


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

import javax.swing.JPanel;

public class Leinwand extends JPanel {

	public Leinwand() {
	}

        // FRAGE
	public void paintComponent(Graphics g) {
		g.setColor(Color.blue);
		g.fillRect(0, 0, 100, 100);
	}
}






Java:
import javax.swing.JFrame;

public class Orange extends JFrame {

	private Leinwand ML;

	public Orange() {
		super("FensterTitel");
		setSize(400, 300);
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		ML = new Leinwand();
		add(ML);

	}

	public static void main(String[] args) {

		Orange MF = new Orange();
		MF.setVisible(true);
	}
}

Vielen Dank schon jetzt für alle Antworten
Chaplin
 
Die paintComponent() Methode wird von Java/Swing aufgerufen, und zwar immer dann wenn was neugezeichnet werden muss. Das kann entweder das verschieben eines Fensters, Mini-/Maximieren oder ein "manuelles" repaint() sein.
Java kümmert sich dann auch darum, dass du ein entsprechendes Graphics Objekt bekommst auf dem du zeichnen kannst.
 
Ganz von vorne oder reicht EDT als Antwort? Ich denke mal, ganz von vorne.
Wann immer im Programm "<Component>.repaint()" (mit all ihren "Fassaden") aufgerufen wird, veranlasst man die JVM einen RepaintEvent in die Queue des EventDispatchThreads (EDT) einzureihen. Das geschieht automatisch, sobald ein Fenster geöffnet, vergrössert, verkleinert oder deiconifiziert wird oder manuell durch expliziten Aufruf von "repaint()". Wenn der EDT auf einen solchen Event stösst, ruft er die "update()"-Methode der darin enthaltenen Component auf. In AWT folgt dann "paint()" und weiter in Swing dann noch "paintComponent()". Anders als in AWT aktualisieren sich in Swing jedoch die Elternkomponenten nicht automatisch, deswegen muss in Swing in der "paintComponent()"-Methode, "super.paintComponent()" die erste "Amtshandlung" sein. Es gibt Leits die versuchen aus Swing-Containern (z.B. JPanel) simple Components zu machen, indem schlicht "update()" oder "paint()" überschreiben. Allerdings sollte man daran eigentlich nicht mal denken, weil am Ende wundert man sich nur, warum nichts mehr so aussieht wie es soll.
[EDIT]Naja... 10min länger für 'ne ausfühlichere Antwort gebraucht. Was soll's...[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben