Qual è il modo migliore di gestire i contesti grafici AWT?
Domanda
Alcuni utenti della nostra applicazione Swing hanno riportato strani artefatti che appaiono sul display. Ciò varia da componenti che non si riverniciano correttamente per un secondo o due, fino a parti intere dell'applicazione che vengono ridipinte come carta da parati piastrellata su aree della finestra.
L'app è stata studiata dagli sviluppatori di tutti i livelli tra esperti ragazzi Java e giovani ragazzi appena usciti dall'università nel corso di circa cinque anni e, come prevedibile, parte del codice AWT è un vero casino . Ora sono di fronte al compito di cercare di correggere il più possibile la cattiveria nei prossimi mesi.
Alcuni di questi sono facili da gestire. Gestisci i componenti solo sul thread di invio degli eventi, IO in modo asincrono, tipo di cose, e spero di trasmettere il messaggio al resto del team.
Quello che mi piacerebbe sapere è il modo migliore di gestire i contesti grafici, specialmente in un contesto paintComponent (). Vedo un sacco di ...
public void paintComponent( Graphics g ) {
super.paintComponent( g );
Graphics2D gfx = (Graphics2D)g;
// ...Whole lotta drawing code...
}
È meglio fare questo?
public void paintComponent( Graphics g ) {
super.paintComponent( g );
Graphics2D gfx = (Graphics2D)g.create();
// ...Whole lotta drawing code...
gfx.dispose();
}
Se il parametro g verrà riutilizzato in altri colori, non è necessario ripristinarlo in buono stato, annullare AffineTransforms, ecc.?
Soluzione
Secondo Filthy Rich Clients, non dovresti modificare l'oggetto Graphics
passato a te (che fa schifo come API, IMO).
Il modo corretto di gestirlo è leggermente più dettagliato:
public void paintComponent(Graphics g1) {
super.paintComponent(g1);
final Graphics2D g = (Graphics2D)g1.create();
try {
// ...Whole lotta drawing code...
} finally {
g.dispose();
}
}
IIRC, nell'implementazione di Sun non importa se non si elimina " Grafica secondaria " oggetti. (Non citarmi su questo.)
Potresti voler delegare quel bit di commento a un altro oggetto.
Altri suggerimenti
Ho sentito che questo problema è stato risolto in jdk-1.6.12, ma non l'ho provato.