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.?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top