Non valide Thread Erreur d'Accès avec Java SWT
J'ai un simple Java SWT application en Java jusqu'à présent, mais la chose étrange est lorsque j'essaie de lancer un messagebox/boîte d'alerte lors de l'écoute d'un événement déclenché par l'un de mes cours, j'obtiens un message d'erreur disant "non Valide fil de l'accès".
Ma classe de l'événement est déclenché et entendu par la classe principale, mais c'est quand il a pour afficher la MessageBox que le "non Valide fil de l'accès" erreur apparaît. Je suis en train d'essayer de montrer la MessageBox dans une fonction qui se composent de tous les autres codes qui permettront de créer les Interfaces graphiques SWT. C'est la façon dont la fonction ressemble à:
public void createContents() {
Shell shell = new Shell();
//.....all the SWT GUI codes....
MessageBox msg = new MessageBox(shell, SWT.OK);
myClass.addEventListener(new MyClassEventClassListener() {
@Override
public void myClassEventHandler(MyClassEvent e) {
msg.setText("Hello");
msg.setMessage("Event fired!");
int result = msg.open();
}
});
}
Ce sont les fonctions auxiliaires ensemble dans la classe.
<!-- language: lang-java -->
protected static Shell shell;
public static void main(String[] args) {
MyClass new myClass = new MyClass();
try {
SWTApp window = new SWTApp();
window.open();
} catch (Exception e) {
}
public void open() {
Display display = Display.getDefault();
createContents();
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
L'erreur trace de la pile est comme suit:
Exception in thread "AWT-EventQueue-0" org.eclipse.swt.SWTException: Invalid thread access
at org.eclipse.swt.SWT.error(SWT.java:4083)
at org.eclipse.swt.SWT.error(SWT.java:3998)
at org.eclipse.swt.SWT.error(SWT.java:3969)
at org.eclipse.swt.widgets.Display.error(Display.java:1249)
at org.eclipse.swt.widgets.Display.checkDevice(Display.java:755)
at org.eclipse.swt.widgets.Display.getShells(Display.java:2171)
at org.eclipse.swt.widgets.Display.setModalDialog(Display.java:4463)
at org.eclipse.swt.widgets.MessageBox.open(MessageBox.java:200)
Toute aide sera grande.
Merci!
Vous devez vous connecter pour publier un commentaire.
Il est jeté parce que votre code d'écouteur est appelée à partir de l'extérieur de la SWT Affichage de fil. Vous exécuter du code sur l'écran thread comme celui-ci:
ou, de manière asynchrone:
asyncExec
horaires de manière asynchrone sur un thread différent.Runnable
.asyncExec
ne pas programmer sur un thread différent (il sera toujours courir sur l'écran thread), mais juste exécuter “quelques temps plus tard” et l'appel ne sera pas bloquant.Display.getDefault()
javadoc dit: "Retourne à l'affichage par défaut. L'un est créé <...> si elle n'existe pas déjà.". Que faire si je ne veux pas faire mon thread de l'INTERFACE utilisateur de l'un? Quels sont les inconvénients? On peut juste vouloir en quelque sorte l'accès existantsDisplay
de l'Eclipse du thread d'INTERFACE utilisateur.Peut-être que ce sera vous aider à:
FAQ Pourquoi dois-je obtenir une défaillance de fil accès exception?
https://wiki.eclipse.org/FAQ_Why_do_I_get_an_invalid_thread_access_exception%3F