2010-04-28 3 views
1

J'ai commencé à utiliser CheckThreadViolationRepaintManager pour détecter les violations EDT.Pourquoi une violation EDT se produit-elle?

Il se plaint:

partner = getParameter("partner",generatePartnerSelectionPanel(),Design.partnerSelectionDuration); 

Parce qu'il n'aime generatePartnerSelectionPanel() parce qu'il ne l'aime pas non JPanel panel = new JPanel(); dans cette méthode. Mais je ne peux pas savoir pourquoi il devrait y avoir un problème à ce sujet.

En plus de détails, generatePartnerSelectionPanel() génère un JPanel (je le fais pas dans l'EDT) mais, dans le getParameter ajouter les JPanel au principal JFrame et je le fais dans l'EDT (en utilisant invokeLater).

Alors, pourquoi devrait-il y avoir un problème?

Répondre

3

Une violation EDT ne signifie pas nécessairement quelque chose a fait vont mal, cela signifie que vous avez essayé de faire une interface graphique action liée à un fil autre que l'EDT (une situation où quelque chose pourrait aller mal).

La création d'un nouveau composant Swing est couverte par "faire quelque chose lié à l'interface graphique", d'où l'avertissement concernant la violation.

Cette forum has quite a discussion explique pourquoi il n'est pas recommandé de créer des composants Swing sur d'autres threads.

0

Swing est hostile au thread. Même si un composant n'est pas réalisé, il peut toujours accéder aux ressources partagées ou appeler le EventQueue.invokeLater. Il y avait une période où il a été largement déclaré que les composants Swing pourraient être créés sur le, mais c'était incorrect.

0

En plus d'utiliser le CheckThreadViolationRepaintManager, j'ai utilisé une solution orientée aspect pour détecter quand des composants Swing sont construits hors de l'EDT. C'est un moyen élégant de dépanner les violations EDT si vous utilisez AspectJ.

Voir ce billet de blog pour plus de détails: si vous vous créez des composants de l'interface graphique dans le thread remis dans le principal

Debugging Swing, the final summary

+0

le lien ne fonctionne plus. avez-vous sa nouvelle adresse? – peterboston

+0

On dirait qu'Oracle a brisé le lien. Désolé, je n'ai pas trouvé de lien valide. – jenglert

2

cela se produira Habituellement. Maintenant, en réalité rien de mauvais ne se produira jamais tant que vous ne le modifiez pas après que vous l'ayez réalisé (setVisible(true) ou pack() réalisera un cadre), MAIS Sun a trouvé un cas de bordure qu'ils prétendent faire ainsi Cela peut causer un problème.

Donc, pour être tout à fait correct avoir votre principal construire votre première fenêtre à l'intérieur un invokeLater ou invokeAndWait.

En fait, je me demande si quitter votre thread principal juste après le invokeLater pourrait permettre à votre application entière de quitter (puisque la fenêtre n'a certainement pas encore eu le temps de se lever) ... Vous pouvez utiliser invokeAndWait sauf votre thread principal ne quitte pas.

Questions connexes