Swing DoubleBuffer mit Icon

Hi,
ich versuche grade eine GUI mit DoubleBuffer zu machen.

Dazu habe ich mir nach diesem Schema einen DoubleBuffer für mein JFrame gebaut:
BufferStrategy (Java Platform SE 6)

In dem von mir geschrieben Layout-Manager wird dann für jedes Objekt, dass dargestellt werden soll eine updateSizePosition() Methode aufgerufen. Bei den ImageIcons, die in den JLabels sind muss dazu die Methode setIcon(new ImageIcon(...)) mit getScaledInstance() aufgerufen werden. Dabei wird jedoch das betreffende Label direkt auf den Bildschirm geschrieben und nicht erst in den BackgroundBuffer wie gewünscht. Das Ergebnis ist ein sehr hochfrequentes Filmmern, weil die Label anschließend von den ForegroundBuffer überschrieben werden, im nächsten sich jedoch alles wiederholt.

Wie kann ich verhindern, dass die Label direkt auf den Bildschirm geschrieben werden?
Kann ich irgendwie den PaintStream oder so auf den Background-Buffer umleiten?
Danke schonaml.
Max
 
Mal ganz langsam: Swing hat automatisch Double Bufferering, da braucht man nichts zu machen.
Aber wichtiger: Du schreibst einen eigenen LayoutManager?
Und noch wichtiger: Während des Layoutens skalierst du ein Bild? :autsch:
 
Also ich habe einen eigenen Layout Manager. Der läuft in einem eigenen Thread und soll aufpassen, dass der gesamte Content immer passend zur Fenstergröße angezeigt wird.
Ich hab mir einen eigenen geschrieben, weil die standard-Layout-Manager das was ich brauche nicht können.
Dieser LayoutManager läuft in seinem Thread ab und ruft alle 16ms (60fps) die Fenstergröße ab und passt die Label usw von der Größe und Position her an.
Weil beim Skalieren des Labels nicht das ImageIcon das in ihm steckt mit skaliert wird muss ich mir das Image holen und dann die ScaledInstance abspeichern. Mit dieser erzeuge ich mir ein neues ImageIcon dass ich per setIcon dem Label zuweise.
Bei dieser Aktion wird der DoubleBuffer umgangen, und das Label wird direkt auf dem Bildschirm angezeigt.

Eigentlich soll in jedem Frame die Position und die Größe der Elemente bestimmt werden und dann sollen alle gleichzeitig auf dem Bildschirm angezeigt werden.
So wie es im Moment läuft kann ich beim Debuggen Schritt für Schritt dabei zusehen, wie die Label hizugefügt werden und am ende wieder vom BackgroundBuffer überschrieben werden...
 
Ohne mir anmaßen zu wollen, das verstanden zu haben, klingt es nach einem ganz, ganz üblen Hack. Sowas wie getTreeLock auf einem anderen Thread als dem EDT aufzurufen wäre eigentlich schon schlimm genug (es nicht zu tun vielleicht sogar weniger, aber) potentiell zeitaufwändige Dinge während des Layouts oder Änderungen an Swing-Components wähend des Layoutens von einem anderen Thread machen zu lassen ... das klingt, als wären da so viele "Fail"s gemischt, dass ... mich der Code schon mal interessieren würde.

Mit einer Mischung aus richtigen LayoutManagern, ggf. Toolkit.getDefaultToolkit().setDynamicLayout(true) und einer Implementierung einer Klasse, die sich wie ein JLabel verhält, aber das Bild nicht skaliert (sondern nur ggf. kleiner zeichnet) sollte man doch schon recht weit kommen...
 

Zurück
Oben