G
Gelöschtes Mitglied 9001
Gast
Hallo,
meine Applikation bietet eine skalierbare Oberfläche. D.h., wenn der User das Fenster in der Größe ändert, werden die Elemente nicht neu angeordnet, sondern gezoomt. Das funktioniert alles bereits prima. Nur müssen bei jeder Größenänderung die verwendeten Grafiken auf die neue Größe skaliert/gerendert werden und das braucht relativ viel Zeit, so daß das Ändern der Fenstergröße sehr zäh vonstatten läuft. LiveResizing ist eingeschaltet und ich möchte es ungern ausschalten (zumal es sicht unter MacOS nur mittels Übergabe eines Startparameters ausschalten läßt und nicht mit dem Toolkit).
Ein erster Lösungsversuch bestand darin, bei einer Größenänderung zunächst ein Abbild der Oberfläche als BufferedImage zu erzeugen und vorrübergehend nur dieses Abbild darzustellen. Ein einzelnes Bild läßt sich wesentlich schneller skalieren. Eine halbe Sekunde nach der letzten Größenänderung wird dann das Abbild verworfen und die Originaloberfläche auf die neue Größe skaliert und dargestellt.
Das Problem dabei ist, daß das Erzeugen des Abbildes immer noch recht viel Zeit benötigt, die der Benutzer als deutlich verzögerte Reaktion beim Beginn des Änderns der Fenstergröße wahrnimmt.
Bislang erzeuge ich das Abbild, in dem ich die paint-Methode des Containers aufrufe und ihr das Graphics-Objekt eines BufferedImage übergebe.
Mit dem Robot das Abbild über einen Screenshot zu erzeugen ist nicht wirklich eine Lösung, da Teile des Fenster außerhalb des Bildschirms liegen könnten oder irgendwelche anderen, nicht zum Programm gehörenden Fenster o.ä. über dem Fenster liegen könnten.
Ich habe dann noch versucht, daß das Abbild bereits vor Beginn einer Größenänderung erzeugt wird. Die Strategie war, 1-2 Sekunden nach dem letzten Ereignis, welches zu einer Änderung des grafischen Inhalts führte, ein Abbild zu erzeugen. Hier allerdings fehlte es mir an einer Möglichkeit, eine solche Änderung festzustellen. Man könnte einen Listener erzeugen, dem jedes Element signalisiert, daß es etwas (neues) gezeichnet hat. Dieser Ansatz erscheint mir jedoch nicht flexibel genug.
Hat jemand noch andere Ideen dazu?
Vielen Dank für alle Tipps!
Rajmund
meine Applikation bietet eine skalierbare Oberfläche. D.h., wenn der User das Fenster in der Größe ändert, werden die Elemente nicht neu angeordnet, sondern gezoomt. Das funktioniert alles bereits prima. Nur müssen bei jeder Größenänderung die verwendeten Grafiken auf die neue Größe skaliert/gerendert werden und das braucht relativ viel Zeit, so daß das Ändern der Fenstergröße sehr zäh vonstatten läuft. LiveResizing ist eingeschaltet und ich möchte es ungern ausschalten (zumal es sicht unter MacOS nur mittels Übergabe eines Startparameters ausschalten läßt und nicht mit dem Toolkit).
Ein erster Lösungsversuch bestand darin, bei einer Größenänderung zunächst ein Abbild der Oberfläche als BufferedImage zu erzeugen und vorrübergehend nur dieses Abbild darzustellen. Ein einzelnes Bild läßt sich wesentlich schneller skalieren. Eine halbe Sekunde nach der letzten Größenänderung wird dann das Abbild verworfen und die Originaloberfläche auf die neue Größe skaliert und dargestellt.
Das Problem dabei ist, daß das Erzeugen des Abbildes immer noch recht viel Zeit benötigt, die der Benutzer als deutlich verzögerte Reaktion beim Beginn des Änderns der Fenstergröße wahrnimmt.
Bislang erzeuge ich das Abbild, in dem ich die paint-Methode des Containers aufrufe und ihr das Graphics-Objekt eines BufferedImage übergebe.
Mit dem Robot das Abbild über einen Screenshot zu erzeugen ist nicht wirklich eine Lösung, da Teile des Fenster außerhalb des Bildschirms liegen könnten oder irgendwelche anderen, nicht zum Programm gehörenden Fenster o.ä. über dem Fenster liegen könnten.
Ich habe dann noch versucht, daß das Abbild bereits vor Beginn einer Größenänderung erzeugt wird. Die Strategie war, 1-2 Sekunden nach dem letzten Ereignis, welches zu einer Änderung des grafischen Inhalts führte, ein Abbild zu erzeugen. Hier allerdings fehlte es mir an einer Möglichkeit, eine solche Änderung festzustellen. Man könnte einen Listener erzeugen, dem jedes Element signalisiert, daß es etwas (neues) gezeichnet hat. Dieser Ansatz erscheint mir jedoch nicht flexibel genug.
Hat jemand noch andere Ideen dazu?
Vielen Dank für alle Tipps!
Rajmund