# repaint() ruft paint() nicht auf



## Kin (29. Mrz 2009)

Hallo,
habe folgendes problem:
Ich erstelle in einem JFrame-Objekt ein weiteres JFrame-Objekt einer anderen Klasse. Dieses neu erstellte Objekt hat eine loop()-unktion, in der alle x millisekunden die repaint()-methode aufgerufen wir. Das Problem: der aufruf von repaint() bewirkt nicht den aufruf von paint().
Wenn Ich das besagte Objekt nicht aus einem JFrame heraus erstelle sondern einfach zu Testzwecken in der main(), dann funktioniert es und repaint() ruft wie gewünscht paint() auf. Weiss jemand, woran das liegen könnte? Auf Wunsch kann ich auch etwas Code posten, dass Problem ist nur, ich weiss nicht was vom code ich posten soll. mir ist vollkommen unklar wo der Fehler liegt.

MfG


----------



## hdi (29. Mrz 2009)

Ich hab auch grad bisschen rumgespielt.
Es scheint, als würde das Frame, indem ein neues Frame erstellt wird, dieses
irgendwo "einsaugen" wenn es ums painten geht.

So führt scheinbar ein repaint() des im Frame erstellten Frames ein paint() 
des *Haupt-Frames* aus.. D.h. quasi: Die paint() Methode des im Frame
erstellten Frames delegiert an die paint() Methode des Haupt-Frames, indem
das Frame erstellt wurde :bahnhof:

So kommt es mir jetzt zumindest nach ein wenig Testen vor.
Warum das so ist -> keine Ahnung! Das ist Profi-Stoff hier, Wildcard o.ä. werden
dazu bestimmt was logisches sagen können... 
Selbst wenn es nur ist: "Man erstellt keine Frames in Frames"


----------



## Kin (29. Mrz 2009)

Dachte schon meine Frage ist wieder verdammt dämlich.  glück gehabt  
Ja habe auch schon daran gedacht, dass es nicht sinnvoll ist aus einem frame ein anderes frame zu erstellen, kam mir beim programmieren aber arg objekt-orientiert vor  keine ahnung


----------



## Gast2 (29. Mrz 2009)

warum erstellst du 2 frames???und nicht ein Dilalog oder Window?


----------



## Kin (29. Mrz 2009)

naja, weil ich zwei frames brauche denke ich.


----------



## hdi (29. Mrz 2009)

Man _braucht_ nie 2 Frames. Was willst du denn konkret haben?
Ein Frame ist ein Fenster, dass einen Eintrag in der Taskleiste hat.
Das heisst nicht, dass Frame die einzige Klasse ist, die ein Fenster darstellt.


----------



## Kin (29. Mrz 2009)

Ok. Mal abgesehn davon, dass das die Frage ja nun auch nicht beantwortet: hier meine Absicht:
Es soll ein Fenster erscheinen, in welchem man einen Pfad zu einer Bild-Datei angeben kann. Ein Klick auf den entsprechenden Button sorgt dann dafür, dass ein neues Fenster aufgeht, in welchem das Bild dann dargestellt und verändert werden kann.


----------



## hdi (29. Mrz 2009)

Ok, sowas wird eig. in derartigen Anwendungen über Tabs geregelt.
D.h. wenn du ein Bild öffnest erscheit im Fenster oben ein Tab, klickste da drauf
bekommst du das Bild zu sehen und ne Werkzeugleiste um es zu bearbeiten, oder sonst was.

Öffnest du ein neues (zB über ein Menü ganz oben), öffnest sich ein neues Tab nebem
dem alten. So, wie man es bei Browsern auch kennt. 

Es gibt solche Dinger auch schon vorgefertigt, ich glaube die Klasse heisst JTabbedPane
oder sowas, und dort kannste eben JPanels adden.

Damit wirst du keine Probleme haben und hast immer nur ein JFrame.
Für den Code bedeutet das kaum einen Unterschied, ob du nun ein JFrame erstellst
oder ein JPanel.

Schau dir die Klasse mal in der API an


----------



## Kin (29. Mrz 2009)

Danke für den Tip. Eventl. versuche ich das mal, obwohl das natürlich die Anwendung vom Aussehen her etwas verändert. aber das ist erstmal egal. Trotzdem würde mich das mit dem repaint()-Aufruf noch interessieren. Also wenn jemand was weiss, bitte sagen!


----------



## hdi (29. Mrz 2009)

> Trotzdem würde mich das mit dem repaint()-Aufruf noch interessieren. Also wenn jemand was weiss, bitte sagen!


Sehe ich auch so :reflect:


----------



## Gast2 (29. Mrz 2009)

Mach ein komplierbares Beispiel wo das Verhalten sichtbar ist...
Und du könntest dein Frame immer nich durch ein JDialog ersetzen, versteh das Problem dabei nicht...


----------



## hdi (30. Mrz 2009)

So, ich glaub ich weiss wo es hackt:
Ein Frame muss auf setVisible(true) geschaltet sein, damit es sich repainted.
Ich hab's grad getestet: 4 Frames, alle auf eine andere Weise erstellt, z.T.
statisch, z.T. nicht, z.T. von innen erstellt, z.T. von aussen....
Alles total egal.

Wenn ein Frame sichtbar ist, wird es repainted, wenn nicht, dann nicht.
(Was ja auch Sinn macht)

@Thread-Ersteller: Kann es sein, dass das dein Problem ist?


----------



## Kin (30. Mrz 2009)

Die Frames sind alle Visible. er zeigt das Fenster ja auch an, nur ruft er dann nicht die paint-methode mittels repaint() auf.
BTW: JDialog statt JFrame ändert nichts


----------



## hdi (30. Mrz 2009)

Dann liegt es an etwas anderem. Falsche Referenz vllt? Poste bitte den Code


----------



## Ebenius (30. Mrz 2009)

SirWayne hat gesagt.:


> Mach ein komplierbares Beispiel wo das Verhalten sichtbar ist...
> Und du könntest dein Frame immer nich durch ein JDialog ersetzen, versteh das Problem dabei nicht...


Ein Dialog wäre bei der Beschreibung eigentlich ungeeignet. Man verwendet einen (J)Dialog, wenn der Benutzer sich etwas ansehen will, dann ggf. ein paar Aktionen ausführt, und danach den (J)Dialog wieder schließen will. Zum Beispiel bei Einstellungen, About Panel, Login Dialog, etc. Hier handelt es sich eher um eine SDI-Anwendung und diese hat nunmal pro Dokument ein Fenster inkl. Eintrag in der Taskleiste und so weiter. Genauso wie wenn man in Word ein weiteres Dokument aufmacht.

Das ganze durch ein JTabbedPane zu ersetzen kann sinnvoll sein, kann aber auch stören; je nachdem, wie mit dem Programm gearbeitet werden soll.

Ebenius


----------

