2009-03-02 6 views
4

Einige Benutzer unserer Swing-Anwendung haben verrückte Artefakte auf dem Display angezeigt. Dies reicht von Komponenten, die sich für ein oder zwei Sekunden nicht richtig übermalen, bis hin zu ganzen Teilen der Anwendung, die wie Kacheltapeten über Bereiche des Fensters neu gestrichen werden.Was ist der beste Weg, mit AWT Graphics Kontexten umzugehen?

Die App wurde von Entwicklern aller Ebenen zwischen erfahrenen Java-Jungs zu jungen Chaps direkt von der Universität im Laufe von fünf Jahren oder so gearbeitet, und wie Sie es erwarten, ist ein Teil des AWT-Code ein absolutes Chaos. Ich stehe nun vor der Aufgabe, in den nächsten Monaten so viel Böses wie möglich zu korrigieren.

Einige davon sind einfach zu handhaben. Behandeln Sie Komponenten nur im Event-Dispatch-Thread, IO asynchron, und ich hoffe, dass ich die Nachricht an den Rest des Teams weiterleiten kann.

Was ich gerne wissen würde, ist der beste Weg, mit Graphics-Kontexten umzugehen, besonders in einem paintComponent() - Kontext. Ich sehe eine Menge ...

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D gfx = (Graphics2D)g; 
    // ...Whole lotta drawing code... 
} 

Ist es besser, dies zu tun?

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D gfx = (Graphics2D)g.create(); 
    // ...Whole lotta drawing code... 
    gfx.dispose(); 
} 

Wenn der g-Parameter in anderen Farben wiederverwendet werden wird dann brauche ich nicht, es zu einem guten Zustand wiederherzustellen, rückgängig machen AffineTransforms usw.?

Antwort

5

Laut Filthy Rich Clients sollten Sie das Graphics Objekt nicht ändern, das an Sie übergeben wurde (was als API, IMO, saugt).

Der richtige Weg, es zu handhaben ist etwas ausführlicher:

public void paintComponent(Graphics g1) { 
    super.paintComponent(g1); 
    final Graphics2D g = (Graphics2D)g1.create(); 
    try { 
     // ...Whole lotta drawing code... 
    } finally { 
     g.dispose(); 
    } 
} 

IIRC, in der Sonne Umsetzung spielt es keine Rolle, ob Sie von „sub-Graphics“ Objekten nicht entsorgen. (Zitieren Sie mich nicht dazu.)

Sie könnten dieses Kommentar-Bit an ein anderes Objekt delegieren.

-1

Ich habe gehört, dass dies in jdk-1.6.12 behoben wurde, aber es nicht versucht.