JDialog n'est pas visible

J'ai un problème avec un JDialog personnalisé, qui est créé dans son propre thread par le cadre principal.

Parfois, le JDialog est invisible, mais ses contrôleurs sont cliquables (si vous savez où se trouve leur position). Le problème ne se produit pas sur Oracle Java 1.7, mais définitivement sur Oracle Java 1.6 (vu dans 1.6.0_37 et 1.6.0_45 ).

Je crée le dialogue comme ceci:

class MyDialog extends Jdialog() {
 public MyDialog(JFrame frame, boolean modal) {
   super(frame, modal);
   [...]
  }
}

Dans mon ordinateur central:

MyDialog dialog = new MyDialog(myMainFrame,true);
dialog.setModalityType(Dialog.ModalityType.DOCUMENT_MODAL);
dialog.setVisible(true);

Le comportement attendu est de bloquer les événements tels que MouseEvents du mainframe et de les placer par-dessus. Cela fonctionne parfaitement sur Java 1.7.

Donc, ma question est, y at-il des choses spéciales à garder à l'esprit lors de la création de JDialogs comme créer seulement, après que le parentframe (propriétaire) est visible ou est-ce un bug connu du Java JRE utilisé? J'ai déjà vérifié au journal de correction de bogue d'Oracle ici sans succès.

2
Vous avez raison, un SSCCE serait mieux, mais mon problème est de prendre part à un grand projet de code, donc un sccce ne reproduirait malheureusement pas mon problème. Je pense que l'indice @Durandal me conduit dans la bonne direction, car il semble y avoir un problème avec le filetage. Cela expliquerait pourquoi cela n'arrive pas toujours mais seulement parfois. Le problème JAVA 1.6/1.7 peut être lié à une conception différente. Merci de votre aide!
ajouté l'auteur alex, source
Il ne devrait y avoir aucune raison d'appeler repaint() ou revalidate comme le suggère @subash. Votre problème semble intermittent, ce qui me fait penser à un problème de threading Swing. Prenez-vous soin de faire tous les appels Swing sur l'EDT? Et d'appeler le code à long terme hors de l'EDT? Le meilleur était si vous pouviez publier un code court qui compile, s'exécute et reproduit votre problème ici, un sscce .
ajouté l'auteur Hovercraft Full Of Eels, source

1 Réponses

"J'ai un problème avec un JDialog personnalisé, créé dans son propre thread par l'image principale"

Si c'est littéralement vrai, c'est le problème.

Vous ne devez pas créer d'instances d'objets Swing, en particulier JComponent sur tout autre thread que le thread Dispatch d'événement. Swing n'est pas entièrement compatible avec les unités d'exécution, utilisez SwingUtilities.invokeAndWait ()/invokeLater() pour exécuter le code lié à l'interface graphique lorsque vous n'êtes pas absolument certain que vous êtes sur l'EDT.

2
ajouté