J'ai une application de bureau Java/Swing (Java 6u16 sous Windows XP) qui semble parfois être bloquée par les utilisateurs. Je dis semble à parce qu'en réalité ce qui se passe est que l'application montre un dialogue modal mais ce dialogue n'est pas rendu. Si l'utilisateur utilise Alt-Tab pour quitter l'application et y revient par la suite, la boîte de dialogue s'affiche correctement. En outre, si un utilisateur distant se connecte à la session via NetOp (un travail similaire à VNC/Remote Desktop), l'interface graphique est également redessinée correctement.Problème de rendu avec l'application Swing et les boîtes de dialogue modales
L'application fonctionne via JavaWebstart. Depuis que je l'ai entendu parler de problèmes de rendu causés par DirectDraw, j'ajouté ce qui suit à la JNLP
<property name="sun.java2d.noddraw" value="true"/>
mais le problème persiste (Si je comprends bien, cela éteint DirectDraw et Direct3D complètement: voir http://download.oracle.com/javase/1.5.0/docs/guide/2d/flags.html#noddraw Je n'ai pas d'idées sur celui-ci, toutes les suggestions seraient grandement appréciées.
Merci,
Phil
Modifier ...
j'ai une classe de dialogue abstraite qui étend JDialog et que tous les autres boîtes de dialogue s'étendent. Il contient la méthode suivante:
public void showDialog() {
initKeyBindings();
Application.getApplication().deactivateScannerListener();
setVisible(true);
}
Chaque fois que je veux afficher une boîte de dialogue, j'appelle showDialog(). La méthode initKeyBindings configure un ActionMap tandis que la deuxième ligne est spécifique à l'application (Application est un singleton, je désactive l'écouteur du scanner JPOS pendant l'affichage de la boîte de dialogue).
Il existe une méthode hideDialog() correspondant comme suit:
public void hideDialog() {
setVisible(false);
Application.getApplication().activateScannerListener();
dispose();
}
Merci, Phil
Modifier ... Désolé à ce sujet, un plus modifier: tous les les boîtes de dialogue ont un parent. La classe AbstractDialog sera définie par défaut sur le cadre de l'application principale si aucun autre parent n'est spécifié.
Pour votre information Pour tous ceux qui suivent, j'ai ajouté ce qui suit à mon code:
if (SwingUtilities.isEventDispatchThread()) {
initialiseAndShowDialog();
} else {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
initialiseAndShowDialog();
}
});
}
Cela garantit que le dialogue est ouvert uniquement de l'EDT.
Pouvez-vous afficher le code qui provoque l'affichage de la boîte de dialogue modale? –
Salut Vincent, merci de votre intérêt. J'ai modifié le post pour contenir un peu plus de détails. – PhilDin