J'ai un thread SwingWorker qui lance une boîte de dialogue modale (à partir d'un écouteur de modification de propriété qui écoute le StateValue de start) et le worker effectue son travail. Cependant, il semble que la méthode done ne soit pas appelée car elle est appelée sur l'EDT mais la boîte de dialogue modale de l'opérateur swing bloque l'EDT. Donc, je ne peux pas fermer la boîte de dialogue à partir de l'EDT (ou de la méthode done). En ce moment je ferme juste la boîte de dialogue du doInBackground à la fin de cette méthode, mais cela semble un peu dangereux de doInBackground puisque ce n'est pas sur l'EDT. Quelle est la meilleure façon de gérer cela? Merci.La boîte de dialogue modale Swing Worker ne se ferme pas
Répondre
La boucle de répartition doit continuer à distribuer les événements associés à SwingWorker
même lorsqu'une boîte de dialogue modale est affichée.
Cela fonctionne pour moi.
import javax.swing.*;
public class Unions {
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() { public void run() {
runEDT();
}});
}
private static void runEDT() {
final JDialog dialog = new JDialog((JFrame)null, true);
new SwingWorker<Void,Void>() {
@Override protected Void doInBackground() throws Exception {
// But this is working.
Thread.sleep(3000);
return null;
}
@Override protected void done() {
dialog.setVisible(false);
}
}.execute();
dialog.setVisible(true);
}
}
Pour référence:
Quand une boîte de dialogue modale est lancé dans Swing, l'exécution de ce thread est arrêté jusqu'à ce que la boîte de dialogue est fermée.
C'est pourquoi votre méthode done() n'a jamais été appelée (doInBackground() n'a pas pu finir et done() n'est appelée qu'après).
L'ouverture d'une boîte de dialogue modale à partir d'une action appelée par le thread EDT est légèrement différente. L'EDT lui-même continuera à traiter les événements mais le code d'événement réel (le code de l'action) qui ouvre la boîte de dialogue modale est toujours bloqué (et attend jusqu'à la fermeture de la boîte de dialogue).
Naturellement, dans le cas de boîtes de dialogue non modales, ce problème ne se pose jamais. Par ailleurs: Vous ne devez jamais ouvrir une boîte de dialogue depuis l'extérieur de l'EDT. Si la décision est prise sur un thread non-EDT, vous devez utiliser SwingUtilities.invokeLater() pour ouvrir la boîte de dialogue.
Cela semble compliqué mais ce n'est pas le cas, une fois que vous maîtrisez le concept de l'EDT.
Je montrais accidentellement le dialogue à partir d'un thread non-EDT et donc les problèmes ne se produisaient parfois. Je suppose qu'il y avait un problème avec cela (bien que je ne peux pas comprendre exactement où le problème a été causé), mais tout va bien maintenant, merci. –
'assert java.awt.EvenQueue.isDispatchThread();' est votre ami (et 'assert! Java.awt.EvenQueue.isDispatchThread();'). –