# Wer ruft paintComponent() Methode auf?



## Froop (5. Mrz 2009)

Hallo,

ich habe die Methode paintComponent() überschrieben und möchte herausfinden für welches jTextField die Mehtode jeweils aufgerufen wird, damit ich für die verschiedenen Textfelder unterschiedlich reagieren kann.




```
JTextField t1;
JTextField t2;

class Test extends JTextField
{
  public void paintComponent(Graphics g)
  {
    super.paintComponent(g);
    // hier eine mögliche Sonderbehandlung
  }
}
```

Vielen Dank schon einmal,
Froop


----------



## Ebenius (5. Mrz 2009)

Froop hat gesagt.:


> Wer ruft paintComponent() Methode auf?


JComponent.paintComponent(Graphics) wird in aller Regel nur von paint(Graphics) des selben Objekts aufgerufen. Was willst Du eigentlich machen?

Nachtrag:



Froop hat gesagt.:


> ich habe die Methode paintComponent() überschrieben und möchte herausfinden für welches jTextField die Mehtode jeweils aufgerufen wird, damit ich für die verschiedenen Textfelder unterschiedlich reagieren kann.


Die Methode wird natürlich immer für "this" aufgerufen.  Sicher, dass Du verstanden hast, was (nicht statische) Methoden sind?

Ebenius


----------



## Froop (5. Mrz 2009)

Ich rufe die Methode von einer anderen Klasse mit
t1.repaint()
t2.repaint()
auf und möchte herausfinden, ob die Methode für t1 oder für t2 aufgerufen wurde.


----------



## Froop (5. Mrz 2009)

Gibt es so etwas wie ein

g.getIrgendetwas() was ich mit dem entsprechenden jTextField vergleichen kann?


----------



## Ebenius (5. Mrz 2009)

Mach doch einfach bei der Initialisierung sowas [HIGHLIGHT="Java"]t1.setName("t1");
t2.setName("t2");[/HIGHLIGHT]
Und dann in der paintComponent(Graphics)-Methode [HIGHLIGHT="Java"]if ("t1".equals(getName())) {
  //...
}[/HIGHLIGHT]
Aber das ganze Konzept halte ich für fragwürdig. Normaler weise lässt sich das immer anders lösen als über einen Namen oder eine Referenz zu prüfen. Für Hinweise müsste man aber mehr übder das Problem wissen. Falls Du nur eine Quick-And-Dirty-Lösung brauchst, das vorgeschlagene natürlich völlig in Ordnung.

BTW: repaint() ruft nicht paint(Graphics) und auch nicht paintComponent(Graphics) auf. Es legt lediglich einen PaintEvent in die EventQueue. Etwas später wird der Event dann vom Event Dispatcher abgearbeitet und paint(Graphics) aufgerufen. Da gibt's keine direkte Verbindung.

Ebenius


----------



## Froop (5. Mrz 2009)

Danke schon einmal.
Dein Vorschlag wäre sicherlich eine Lösung, leider nicht ganz was ich suche, aber vielleicht gibt es das ja auch nicht.


----------



## Ebenius (5. Mrz 2009)

Mein Vorschlag macht sogar *ganz genau* was Du suchst. Denk nochmal darüber nach!

Ebenius


----------



## Froop (5. Mrz 2009)

Wer lehsen kann ich schwär im Forteil.
Ok! setName war mir bisher nicht so bekannt. 

Danke für den Tipp,
Froop


----------



## Ebenius (5. Mrz 2009)

Alternativ kannst Du analog auch JComponent.putClientProperty(Object, Object) und JComponent.gutClientProperty(Object) benutzen.

Ebenius


----------



## André Uhres (6. Mrz 2009)

Froop hat gesagt.:


> Wer ruft paintComponent() Methode auf?


Falls jemand sein Wissen vertiefen möchte, hier noch ein paar zusätzliche Infos:

JComponent.repaint() registriert einen asynchronen repaint Antrag beim RepaintManager der Komponente, der invokeLater() benutzt, um einen Runnable entstehen zu lassen, der den Antrag später auf dem "event dispatching thread" verarbeitet.

Der Runnable wird auf dem "event dispatching thread" ausgeführt und er veranlasst den RepaintManager der Komponente, paintImmediately() auf der Komponente aufzurufen, die folgendes tut:

1. verwendet das Cliprechteck und die Eigenschaften "opaque" und "optimizedDrawingEnabled", um die 'root' Komponente festzustellen, von der aus der Malvorgang anfangen muß (um sich um Transparenz und möglicherweise überlappende Komponenten kümmern zu können).

 2. ruft paint() auf der 'root' Komponente auf (was die JComponent.paint() Schritte paintComponent(), paintBorder() und paintChildren() durchführt), und verursacht so, daß alles unter dem 'root' gemalt wird, was sich mit dem Cliprechteck überschneidet.

Noch mehr Infos über die AWT und Swing Malmechanismen finden wir hier:
Malen in AWT und Swing - Byte-Welt Wiki


----------

