Question

Certains utilisateurs de notre application Swing ont signalé la présence d'artefacts étranges à l'écran. Cela va des composants qui ne se repeignent pas correctement pendant une seconde ou deux, et même jusqu’à des parties entières de l’application qui sont repeintes comme du papier peint en mosaïque sur des zones de la fenêtre.

L’application a été travaillée par des développeurs de tous les niveaux, de Java expérimenté à jeune homme sortant de l’université en cinq ans environ, et comme on peut s’y attendre, une partie du code AWT est un véritable gâchis. . Je suis maintenant confronté à la tâche d'essayer de corriger autant de mal que possible au cours des prochains mois.

Certains sont faciles à gérer. Traitez les composants uniquement sur le thread de répartition des événements, IO de manière asynchrone, ce genre de chose, et j'espère que je transmettrai le message au reste de l'équipe.

Ce que j'aimerais savoir, c'est la meilleure façon de traiter les contextes graphiques, en particulier dans un contexte paintComponent (). Je vois beaucoup de ...

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

Est-il préférable de le faire?

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

Si le paramètre g doit être réutilisé dans d'autres peintures, n'ai-je pas besoin de le restaurer dans un état correct, annulez AffineTransforms, etc.?

Était-ce utile?

La solution

Selon Filthy Rich Clients, vous ne devez pas modifier l’objet Graphics qui vous a été transmis (ce qui ressemble à une API, IMO).

La manière correcte de le gérer est légèrement plus détaillée:

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

IIRC, dans l'implémentation Sun, le fait de ne pas supprimer "sub-Graphics" n'a aucune importance. objets. (Ne me citez pas là-dessus.)

Vous pouvez souhaiter déléguer ce commentaire à un autre objet.

Autres conseils

J'ai entendu dire que cela avait été corrigé dans jdk-1.6.12, mais je ne l'ai pas essayé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top