Frage

Ich habe ein Java-Applet, das AWT verwendet. In einigen (seltenen) Umständen ist die Plattform nicht richtig auf den Bildschirm aktualisieren. Ich kann das Fenster und sehe, dass mein Applet ordnungsgemäß aktualisiert bewegen oder minimieren / maximieren. Ich suche Code, der mich so weit wie möglich Applet Bildschirm aufgefrischt geben, das Verhalten einer Simulation minimieren / maximieren.

Ich habe versucht, verschiedene Kombinationen von Farben () aufrufen / repaint () / ungültig () / Update () auf den übergeordneten Container und Rekursion auf verschiedenen Kinder. keine Kombination jedoch (die ich gefunden habe) reinigt den Rahmen Bugs, die mir begegnet ist. Ich bin auf der Suche nach Techniken, um vollständig das Applet zu aktualisieren, selbst wenn sie etwas leichtes Flimmern verursachen kann, da ich nur auf die problematische Plattform diesen Code aufrufen wird.

In meinen Tests hat Swing bewegt sich nicht helfen, mein Problem zu lösen.

übrigens ist dies eine Vereinfachung meines früheren (komplizierteren) Beitrag: Java-Applet, AWT Refresh Problem Mac OS X 10.4

Edit: Investigation in Threading löst nicht das Problem. Kennzeichnung beste Antwort als gut.

War es hilfreich?

Lösung

Dies geschieht die ganze Zeit, wenn Sie nicht sorgfältig programmieren in AWT / Swing.

Zunächst einmal sollten Sie alle Arbeiten an dem Event Thread tun. Dies bedeutet, dass Sie nichts davon in der Haupt Aussage machen können (oder irgendetwas ruft sie direkt). Ich weiß, dass jede Java-GUI-Anwendung jemals gegen diese Regel erfunden, aber das ist die Regel.

Für den größten Teil, sie zu sagen pflegt man einen nicht-AWT-Thread verwenden könnte, bis das Fenster „Realisiert“ wurde (pack / setVisible), aber Sun herausgefunden, dass nicht immer funktionieren.

Zweitens, wenn Sie ein Ereignis auf dem AWT-Thread erhalten, sollten Sie es schnell zurückzukehren. Nie schlafen oder eine lange Operation auszuführen.

Drittens (und dies ist eine Erweiterung von „First“, wenn Sie einen Rückruf erhalten, die nicht bereits auf dem AWT-Worker-Thread ist, sollten Sie es auf dem AWT Thread zu setzen, bevor mit der GUI etwas zu tun.

Im Allgemeinen kann jedes Ereignis durch eine AWT-Komponente erzeugt auf dem richtigen Thread sein wird. Ereignisse, die von Timern erzeugt, manuell erzeugten Fäden, oder das einem zur Hauptgeben () sind es nicht.

Andere Tipps

Das Verfahren für diese Art von Problem zu verwenden ist neu streichen, wie Sie erwähnt haben. Es ist möglich, dass Sie ein Problem mit der JVM sehen Sie verwenden. Ich würde mit verschiedenen Versionen der Sun JVM und sogar die MS VM für IE empfehlen, um zu sehen, ob dies ein VM verwandtes Problem ist -. Es eigentlich um Ihren Code nicht verwandt sein kann

Ich habe nicht wirklich versucht, diese vor, sondern eine kreative Art und Weise (dh. Gemeiner Hack) um das könnte Javascript aus dem Applet auszuführen, ein DOM-Methode aufrufen, ein Mock-Resize des Fensters zu tun oder vielleicht auf das konzentrieren, rufen der Körper in einem Versuch, eine externe Nachziehen der Leinwand zu führen.

Nicht sicher, ob dies im Zusammenhang mit, was Sie gesehen haben, aber wenn man die Leistung der AWT Event-Queue aufstehen gegen die Java 2D + 3D-Welt (Grafik-Pipeline Leute) wird in eine Gewinde Strategie zeigt und dann ‚Sie bekommen in die dispose Problem werde.

Diese Diskussion bei Design gesucht hat die AWT Event-Queue für Grafiken verwendet wird, wie bei der Verwendung „neu streichen“.

In dem Gewinde Ansatz besteht ein Shutdown Problem.

Notizen in java / awt / SequencedEvent für "entsorgen" verweisen wir auf "AWT Threadingprobleme" und "Autoshutdown".

Ich denke, dass dieses Stück info zumindest dient, das Problem zu konzentrieren.

konnte ich 99% meines AWT-Applets beheben Probleme neu gezeichnet durch den Wechsel zu Swing. Swing scheint zuverlässiger auf erfrischend.

Früher hatte ich eine Menge manueller repaints () in meinem Applet-Code, aber mit Schwingen diese wurde entfernt und Applet ist jetzt schneller vor allem unter Terminal Server / LTSP.

Ich stellte kritische Sachen innerhalb dieser:

public class VeryFastPanel extends JPanel {



    /**
         *
         */
        private static final long serialVersionUID = 1L;

        public void update(Graphics g) {

      paint(g);
    }

}

fand ich ein Problem, das die gleiche Sie erleben zu sein scheint. Nach einigen Tests, entdeckte ich, dass dies auf Aero und Intel Graphics Adapter bezogen werden können. In meinem Fall hielt die Anwendung neu zu streichen nur, wenn sie in Notebooks ohne AC-Adapter, angetrieben durch Batterien verwendet. Wenn Sie einige Energiesparfunktionen im Intel-Treiber-Konfiguration deaktivieren (insbesondere Intel 2D-Display-Technologie in alten Treiberversionen) Java wird in der Regel wieder neu streichen.

In meinem Fall habe ich Möglichkeiten, diese Option auch über Registry zu deaktivieren. Es ist nicht dokumentiert, aber es funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top