2011-08-29 2 views
6

J'ai un programme principal, dans lequel GUI est basé sur le swing et selon l'un des quatre états, les éléments GUI ont des paramètres différents. Et si je veux rafraîchir l'interface graphique, j'appelle seulement updateGUI avec le paramètre approprié, et tout va bien. Mais le programme crée également un thread supplémentaire, qui après le traitement des données pertinentes devrait changer le programme principal de l'interface graphique. Malheureusement, je ne peux pas dans ce thread appeler la méthode updateGUI (..).Actualisation de l'interface graphique par un autre thread dans java (swing)

Je sais que je peux utiliser invokeLater ou SwingWorker pour actualiser mais il y a plus de 10 éléments donc je préfère utiliser la méthode udpateGUI().

Je serai reconnaissant pour toute allusion.

+0

S'il vous plaît jeter un oeil à la réponses sur les événements et le bus de l'événement dans cette question: http://stackoverflow.com/questions/7131484/how-to-pass-the-message-from-working-thread-to -gui-in-java/7131574 # 7131574 –

+0

Pourquoi ne pas appeler updateGUI de l'autre thread? Mis à part l'accès non synchronisé à la variable d'état, je ne vois pas pourquoi vous ne pourriez pas utiliser cette méthode depuis l'autre thread. –

+0

si j'appelle Frame f = new Frame(); f.udpateGUI (..); alors bien sûr rien ne s'est passé. Sinon, comment puis-je invoquer cette méthode? – galica

Répondre

7

Si vous faites le fil sur le terrain status sûr, vous pouvez appeler setStatus directement à partir de votre fil d'arrière-plan. Pour rendre l'état thread-safe, placez les modifications dans un bloc de synchronisation et rendez la variable volatile pour que les mises à jour sur les autres threads deviennent visibles.

E.g.

public class Frame extends JFrame implements Runnable { 
private volatile Status status = 1; 
... 
@Override 
public void run() { 
    switch (status) { 
     case 1: 
     ... 
     case 2: 
     ... 
} 

public void updateGUI(Status status) { 
    setStatus(status); 
    SwingUtilities.invokeLater(this); 
} 

private synchronized void setStatus(Status status) { 
    this.status = status; 
} 

Avec ces changements en place, il est correct d'appeler setStatus de tout fil.

16

Voici un petit extrait que vous pouvez ajouter à une méthode pour vérifier qu'elle s'exécute dans le thread graphique. Il repose sur isEventDispatchThread().

public void updateGUI(final Status status) { 
    if (!SwingUtilities.isEventDispatchThread()) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      updateGUI(status); 
     } 
    }); 
    return; 
    } 
    //Now edit your gui objects 
    ... 
} 
+0

merci, qui a également été utile. – galica

Questions connexes